在.NET世界中,当谈到对象序列化时,它通常用于在运行时检查对象的字段和属性.对此作业使用反射通常很慢,并且在处理大量对象时是不合需要的.另一种方法是使用IL发射或构建表达树,这些表现树相对于反射提供显着的性能增益.而后者是处理序列化时最现代化的库.但是,在运行时构建和发送IL需要花费时间,并且只有在将此信息缓存并重用于相同类型的对象时才会回收投资.
当使用Json.NET时,我不清楚使用上述哪种方法,如果确实使用了后者,是否使用了缓存.
例如,当我这样做时:
JsonConvert.SerializeObject(new Foo { value = 1 });
Run Code Online (Sandbox Code Playgroud)
Json.NET是否构建了Foo的成员访问信息并缓存以便以后重用它?
我正在尝试序列化/反序列化Dictionary<string, object>C#。对象可以是任何可序列化的对象。
Json.NET几乎可以工作,但是如果字典中的值是an enum,则反序列化是不正确的,因为它反序列化为a long。TypeNameHandling.All没有任何区别。
序列化库是否有其他快速解决方案。结果不必是JSON,而必须是文本。
我对传递到字典的数据也没有影响。我只需要对遇到的任何问题进行序列化和反序列化。
编辑:StringEnumConverter没有帮助。数据被转换回Dictionary<string, object>,因此解串器不知道序列化的值是enum。它像对待对象一样对待它,反序列化后StringEnumConverter它仍然是一个对象string。如果long没有转换器,它将反序列化。JSON.NET不会保留枚举。
我要提供的解决方案是现有接口的实现,该接口被注入到我无法更改的现有解决方案中。
EDIT2:这是我正在尝试做的一个例子
public enum Foo { A, B, C }
public enum Bar { A, B, C }
public class Misc { public Foo Foo { get; set; } }
var dict = new Dictionary<string, object>();
dict.Add("a", Foo.A);
dict.Add("b", Bar.B);
dict.Add("c", new Misc());
// serialize dict to a string s
// deserialize s …Run Code Online (Sandbox Code Playgroud) 按照官方文档:
string jsonTypeNameAll = JsonConvert.SerializeObject(stockholder, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
Console.WriteLine(jsonTypeNameAll);
// {
// "$type": "Newtonsoft.Json.Samples.Stockholder, Newtonsoft.Json.Tests",
// "FullName": "Steve Stockholder",
// "Businesses": {
// "$type": "System.Collections.Generic.List`1[[Newtonsoft.Json.Samples.Business, Newtonsoft.Json.Tests]], mscorlib",
// "$values": [
// {
// "$type": "Newtonsoft.Json.Samples.Hotel, Newtonsoft.Json.Tests",
// "Stars": 4,
// "Name": "Hudson Hotel"
// }
// ]
// }
// }
Run Code Online (Sandbox Code Playgroud)
我已经复制粘贴了这段代码。
public static string Convert<T>(T cacheObject)
{
return JsonConvert.SerializeObject(cacheObject, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我用 调用它Convert(DateTime.Now),我会得到一个序列化的 …