【发布时间】:2014-12-20 21:33:54
【问题描述】:
我想序列化一个可能包含System.Drawing.Color 值或其他类型作为值的Dictionary<string, object>。我用TypeNameHandling.Auto 创建了一个序列化程序,这适用于大多数类,但不适用于Color。
示例代码:(DotNetFiddle:https://dotnetfiddle.net/UvphQO)
public class Program
{
class A { }
class B { }
public static void Main()
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict["Foo"] = new A();
dict["Bar"] = new B();
dict["Baz"] = new object();
dict["Rainbow"] = Color.FromArgb(20, 20, 20, 20);
var ser = new JsonSerializer
{
TypeNameHandling = TypeNameHandling.Auto
};
var w = new JsonTextWriter(Console.Out)
{
Formatting = Formatting.Indented
};
ser.Serialize(w, dict);
}
}
结果输出:
{
"Foo": {
"$type": "Program+A, mi1i2eqo"
},
"Bar": {
"$type": "Program+B, mi1i2eqo"
},
"Baz": {},
"Rainbow": "20, 20, 20, 20"
}
正如预期的那样,字典中A 或B 的实例具有重建所需的$type 元数据。但是Color 的实例没有。当这个 json 被反序列化时,dict["Rainbow"] 是一个System.String。
有很多方法可以解决这个问题,但首选的解决方案是弄清楚为什么序列化程序在这种情况下使用$type 做一些看似不正确的事情。
【问题讨论】: