using System.Collections.Generic;
using SerFunc = System.Func<System.Text.StringBuilder, object, bool, bool>;
public TypedSerFunc(SerFunc fn)
private TypedSerFunc serializer;
private Dictionary<String, TypedSerFunc> foundFuncs;
private String formatTypeName(Type objType)
if (objType.IsGenericType)
var genericTypes = objType.GetGenericArguments();
String name = objType.Name.Remove(objType.Name.IndexOf('`'));
foreach (var gen in genericTypes)
name += formatTypeName(gen);
private static void addComa(bool isAddComa, StringBuilder builder)
private SerFunc createSerializerPrimitive(Type objType)
if (objType == typeof(String))
return (builder, obj, isAddComa) => {
if (objType == typeof(bool))
return (builder, obj, isAddComa) => {
builder.Append((bool)obj ? "true" : "false");
return (builder, obj, isAddComa) => { builder.Append(obj); return true; };
private SerFunc createSerializerArray(Type objType)
MethodInfo getElem = objType.GetMethod("get_Item");
TypedSerFunc serizalizeElem = createSerializer(getElem.ReturnType);
return (builder, obj, isAddComa) => {
System.Collections.IEnumerable arr = (System.Collections.IEnumerable)obj;
if (serizalizeElem.Fn(builder, el, current != 0))
private SerFunc createSerializerMap(Type objType)
List<SerFunc> funcs = new List<SerFunc>();
foreach (FieldInfo info in objType.GetFields())
TypedSerFunc serizalizeField = createSerializer(info.FieldType);
funcs.Add((builder, obj, isAddComa) => {
var field = info.GetValue(obj);
addComa(isAddComa, builder);
builder.Append(info.Name);
serizalizeField.Fn(builder, field, false);
return (builder, obj, isAddComa) => {
addComa(isAddComa, builder);
foreach (SerFunc func in funcs)
if (func(builder, obj, current != 0))
private TypedSerFunc createSerializer(Type objType)
String typeName = formatTypeName(objType);
TypedSerFunc result = null;
if (foundFuncs.TryGetValue(typeName, out result))
result = new TypedSerFunc();
foundFuncs.Add(typeName, result);
if (objType.IsPrimitive || objType == typeof(String))
result.Fn = createSerializerPrimitive(objType);
if (objType.GetInterface("System.Collections.IEnumerable") != null)
result.Fn = createSerializerArray(objType);
result.Fn = createSerializerMap(objType);
foundFuncs = new Dictionary<String, TypedSerFunc>();
serializer = createSerializer(typeof(T));
public String Serialize(T root)
StringBuilder builder = new StringBuilder(4 * 1024 * 1024);
serializer.Fn(builder, root, false);
return builder.ToString();
public List<int> Numbers = new List<int>();
public List<int> Numbers = new List<int>();
public Test2 MyTest2 = new Test2();
public static void Main()
SerializerJSON<Test> ser = new SerializerJSON<Test>();
var result = ser.Serialize(a);
System.Console.WriteLine(result);