newtonsoft json memmory reservation serialize

91 views Asked by At

If I would (and i might) write my own simple json serializer, something alike below code.
Then in my code I can specify for stringbuilder a size, to optimize memory handling.

However the current code i'm working on is depending on Newtonsoft in a large code base, and i wonder if it has a similar option to set a predefined reservation for memory usage. (not a strict one), acting upon serialize to json. Does anyone know if it has something so we don't get heap fragmentation.

using System.Collections;
using System.Reflection;
using System.Text;

public static string ConvertToJsonProperty(object obj)
{
capaciy = 170000 // in bytes, doubles if it doesnt fit (double or in mem pages of equal size?)
var builder = new StringBuilder(capacity);  //  <setting an estimated size (ea 110% of something)
WriteValue(builder, obj);
return builder.ToString();
}

private static void WriteValue(StringBuilder builder, object value)
{
if (value == null)
{
    builder.Append("null");
    return;
}

var type = value.GetType();

if (type == typeof(string) || type.IsPrimitive)
{
    builder.Append(JsonEncode(value.ToString()));
    return;
}

if (type.IsArray)
{
    builder.Append("[");
    var array = (IEnumerable)value;
    var isFirst = true;
    foreach (var item in array)
    {
        if (!isFirst)
            builder.Append(",");

        WriteValue(builder, item);
        isFirst = false;
    }
    builder.Append("]");
    return;
}

builder.Append("{");
var properties = type.GetProperties();
var isFirstProperty = true;
foreach (var property in properties)
{
    if (!isFirstProperty)
        builder.Append(",");

    builder.AppendFormat("\"{0}\":", JsonEncode(property.Name));
    WriteValue(builder, property.GetValue(value));
    isFirstProperty = false;
}
builder.Append("}");
}

private static string JsonEncode(string value)
{
return "\"" + value.Replace("\"", "\\\"") + "\"";
}
0

There are 0 answers