我试图将客户端和服务器之间发送的对象序列化和反序列化为JSON . 我将来自客户端的所有消息包装在一个简单的Request-object中,如下所示:
class Request
{
public string Command { get; set; }
public object[] Arguments { get; set; }
}
参数数组可以是所选命令所需的任何类型的对象 . 然后在服务器上反序列化并希望Request与Arguments数组中相同类型的对象看起来完全相同 .
我已经尝试过.Net和Json.Net中包含的JavascriptSerialization,但两者都在参数列表中遇到了一些对象类型的问题 . 字符串,整数和其他基本内容很好地工作,但是例如Guid总是在反序列化后作为字符串弹出 .
使用Json.Net时,其他复杂对象变为“JObject” . (我从@jlvaquero那里得到了帮助来解决这个问题 . )
有没有人建议如何使反序列化尽可能正确?
2 回答
您需要使用TypeNameHandling设置 .
如果JSON字符串在每个序列化对象中包含运行时类型,则JSon.Net将其与运行时类型进行反序列化 .
输出:
如果你做
r.Arguments[2] = Guid.NewGuid()
JSON.Net将其反序列化为String
. 我已经在Newtonsoft.Json repoisotry中打开了一个问题,当我们等待响应时,我已经分叉了原始的github存储库,以便在Object Array
支持中添加Guid
. 我的回购是here并且对这个特定问题很有效,但是除了这个例子之外没有测试过,所以使用它需要你自担风险 .您应该能够通过将Json.Net中的
JsonSerializerSettings
设置为包含类型信息这将在json字符串上包含一个名为
$type
的新属性,在反序列化对象时为Json.Net提供一个提示 .您需要在序列化的两侧使用
JsonSerializerSettings
才能使其正常工作 .更多信息:http://www.newtonsoft.com/json/help/html/serializetypenamehandling.htm
Example
输出