using System.Collections.Generic;
using SerFunc = System.Action<System.Text.StringBuilder, object>;
private SerFunc serializer;
private SerFunc createSerializerPrimitive(Type objType)
return new SerFunc((StringBuilder builder, object obj) => {
builder.Append(obj.ToString());
private SerFunc createSerializerArray(Type objType)
MethodInfo getElem = objType.GetMethod("get_Item");
SerFunc serizalizeElem = createSerializer(getElem.ReturnType);
return new SerFunc((StringBuilder builder, object obj) => {
System.Collections.IEnumerable arr = (System.Collections.IEnumerable)obj;
serizalizeElem(builder, el);
private SerFunc createSerializerMap(Type objType)
List<SerFunc> funcs = new List<SerFunc>();
foreach (FieldInfo info in objType.GetFields())
SerFunc serizalizeField = createSerializer(info.FieldType);
funcs.Add(new SerFunc((StringBuilder builder, object obj) => {
builder.Append(info.Name);
serizalizeField(builder, info.GetValue(obj));
return new SerFunc((StringBuilder builder, object obj) => {
foreach (SerFunc func in funcs)
private SerFunc createSerializer(Type objType)
if (objType.IsPrimitive || objType == typeof(String))
return createSerializerPrimitive(objType);
if (objType.GetInterface("System.Collections.IEnumerable") != null)
return createSerializerArray(objType);
return createSerializerMap(objType);
public SerializerJSON(Type rootType)
serializer = createSerializer(rootType);
public String Serialize(object root)
System.Text.StringBuilder builder = new System.Text.StringBuilder(4 * 1024 * 1024);
serializer(builder, root);
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 ser = new SerializerJSON(typeof(Test));
var result = ser.Serialize(a);
System.Console.WriteLine(result);