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("\"", "\\\"") + "\"";
}