【发布时间】:2011-11-07 17:06:48
【问题描述】:
我们有一个包含所有数据合同的合同程序集。我们正在使用 JSON.net 将我们的数据合约序列化为 json。
JSON.Net 在序列化的 $type 属性中添加类型名称和程序集名称。由于我们所有的数据合约都在同一个程序集中,总是加载在当前应用程序域中,我们应该可以省略它。
我们怎样才能做到这一点?
谢谢
【问题讨论】:
-
你是怎么调用序列化的?
我们有一个包含所有数据合同的合同程序集。我们正在使用 JSON.net 将我们的数据合约序列化为 json。
JSON.Net 在序列化的 $type 属性中添加类型名称和程序集名称。由于我们所有的数据合约都在同一个程序集中,总是加载在当前应用程序域中,我们应该可以省略它。
我们怎样才能做到这一点?
谢谢
【问题讨论】:
您可以在JsonSerializerSettings 中使用Binder 属性。
这篇博文(由库作者撰写)描述了步骤:http://james.newtonking.com/archive/2011/11/19/json-net-4-0-release-4-bug-fixes.aspx
简而言之,您创建一个派生自SerializationBinder 的自定义类并覆盖两个方法:
BindToName(Type serializedType, out string assemblyName, out string typeName) BindToType(string assemblyName, string typeName)您在这些方法中放置的逻辑将让您直接控制如何将类型名称转换为$type 字段中的字符串表示形式,以及如何在运行时定位来自$type 的给定值。
在您的情况下,想要省略程序集名称,您可能可以这样做:
public override void BindToName(
Type serializedType, out string assemblyName, out string typeName)
{
assemblyName = null;
typeName = serializedType.FullName;
}
public override Type BindToType(string assemblyName, string typeName)
{
return Type.GetType(typeName);
}
【讨论】:
我想也许可以用JsonObjectAttribute标记这个类
[DataContract]
[JsonObject("")]
public class MyContractClass { ... }
这应该覆盖它也是一个 DataContract 的事实。
【讨论】: