我想序列化一个Dictionary<string, object>
可能包含System.Drawing.Color
值或其他类型作为值。我创建了一个序列化器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
or B
字典里有需要的$type
用于重建的元数据。但实例Color
不要。当这个json被反序列化时,dict["Rainbow"]
is a System.String
.
有很多方法可以解决这个问题,但首选的解决方案是找出序列化器执行看似不正确的操作的原因$type
在这种情况下。