Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于.Net的快速、动态单向JSON序列化_C#_.net_Json_Serialization_Datacontractjsonserializer - Fatal编程技术网

C# 用于.Net的快速、动态单向JSON序列化

C# 用于.Net的快速、动态单向JSON序列化,c#,.net,json,serialization,datacontractjsonserializer,C#,.net,Json,Serialization,Datacontractjsonserializer,我想将CLR对象序列化为JSON字符串,但我有以下限制: 我不能使用外部库。我的项目本身就是一个库,我不能引入依赖项。 序列化必须是单向的。i、 我的.Net对象将没有任何设置器。这是因为无法将JSON中的一些数据序列化回托管对象。 它必须是动态的。要序列化的某些类型在运行时之前是未知的。 它一定很快,原因很明显。我曾考虑过使用反射并手动执行序列化,但我担心会造成时间损失。 你的问题似乎非常广泛,邀请人们为你提供一个现成的解决方案。我不打算这么做,但我可以给你一些提示,说明如何用3对4解决问题

我想将CLR对象序列化为JSON字符串,但我有以下限制:

我不能使用外部库。我的项目本身就是一个库,我不能引入依赖项。 序列化必须是单向的。i、 我的.Net对象将没有任何设置器。这是因为无法将JSON中的一些数据序列化回托管对象。 它必须是动态的。要序列化的某些类型在运行时之前是未知的。 它一定很快,原因很明显。我曾考虑过使用反射并手动执行序列化,但我担心会造成时间损失。
你的问题似乎非常广泛,邀请人们为你提供一个现成的解决方案。我不打算这么做,但我可以给你一些提示,说明如何用3对4解决问题

以下是将任意类型的对象读入键值对集合的一些基本代码:

void Main()
{
    var reader = CreateReader(typeof(Foo));
    reader(new Foo { Bar = "BARRRRR", Baz = 123 }).Dump();
}

public class Foo
{
    public string Bar {get; set;}
    public int Baz {get; set;}
}


static ConstructorInfo Ctor = typeof(KeyValuePair<string, object>).GetConstructor(new Type[] { typeof(String), typeof(Object) });

static Func<object, IEnumerable<KeyValuePair<string, object>>> CreateReader(Type t)
{
    var prm = Expression.Parameter(typeof(Object), "prm");
    var obj = Expression.Variable(t, "obj");
    var arr = new List<Expression>();

    foreach (var p in t.GetProperties(BindingFlags.Public | BindingFlags.Instance))
    {
        arr.Add(Expression.New(Ctor, Expression.Constant(p.Name), Expression.Convert(Expression.Property(obj, p), typeof(Object))));
    }

    var body = Expression.Block(
        typeof(IEnumerable<KeyValuePair<string, object>>),
        new ParameterExpression[] { obj },
        Expression.Assign(obj, Expression.Convert(prm, t)),
        Expression.NewArrayInit(typeof(KeyValuePair<string, object>), arr)
    );

    return Expression.Lambda<Func<object, IEnumerable<KeyValuePair<string, object>>>>(body, prm).Compile();
}
这允许您创建一个读卡器委托,它与任何静态编译代码一样快速高效。这会给你足够的方向,让你想用它做什么就做什么

接下来的步骤是创建所有管道:

递归地遍历要序列化的对象树 创建和/或缓存读卡器 读取键值对并将其写入JSON。 这些都是琐碎的任务,你应该照顾好自己。JSON规范公开于


祝你好运。

你的第三个和第四个要求不可能同时满足。要保持动态,它必须使用反射,这不能太快。我将作为.Net使用者使用的反射与通过数据契约序列化或ISerializablean中的非反射分析执行的反射之间存在差异,这就是为什么C非常棒+1讽刺的定义:我从未考虑过使用表达式树,即使要序列化的大多数数据是表达式树:。谢谢