【发布时间】:2015-05-14 14:21:11
【问题描述】:
我们使用 Json.net 进行序列化。我们希望几乎任何类型的用户定义的类/消息都可以序列化。
Json.net 无法立即支持的一件事是,如果您在 object 字段中存储 int、float 或 decimal。
例如
public class SomeMessage
{
public object Something {get;set;}
}
如果我在Something字段中存储int、float或decimal,它将被反序列化为long或double(因为json.net只能猜测json 中基元的类型(“foo”:123
我完全知道我可以在属性上使用正确的类型并设置各种提示。
但我想为任何随机类/消息解决这个问题。
我目前的方法是自定义 JsonConverter,它处理上述类型,然后将它们序列化为代理类型,该类型将值作为字符串保存,并区分这是什么类型。 然后在 ReadJson 上,我将其转回正确的类型。
这样做有很多过热。 特别是对于代理类型的类型名。 "foo.bar.baz.PrimitiveSurrogate, mylib"
我可以自定义这个类型名的存储方式吗? 例如如果我想为某些特定类型应用别名?
还有其他方法吗? 我可以将整个内容序列化为一个特殊的字符串,它会更小,但话又说回来,感觉很不确定。
那么,如果我想在存储在无类型结构中时保持原语的正确类型,我有哪些选择?
[编辑]
普通Json:
{
"foo":123
}
对比
我们当前的代理版本:
{
"foo": {
"$type":"Akka.Serialization.PrimitiveSurrogate, Akka",
"V":"123",
"T":1
}
}
我可以只用 `"V":"123L" 替换 V 和 T 并解析后缀,因为我们只在该类型中存储 int、float 和 decimal,因此我们可以轻松获得硬编码的描述符。
但是,这仍然没有摆脱代理本身的 $type,我想至少将其缩短为类似 `"$type":"Surrogate" 或者那个方向的东西。
[再次编辑] 我把它归结为:
{"$type":"Akka.Util.PrimitiveSurrogate, Akka","V":"F123.456"}
但我真的很想摆脱长类型名并以某种方式替换为别名。
[再次编辑]
我现在明白了:
{"$":"M123.456"}
这已经足够好了。 我们不需要与任何其他 json 系统互操作,它只是我们两端的框架,所以即使它不漂亮,也可以使用。
【问题讨论】:
标签: c# json serialization json.net