【问题标题】:How do I omit the assembly name from the type name while serializing and deserializing in JSON.Net?如何在 JSON.Net 中序列化和反序列化时从类型名称中省略程序集名称?
【发布时间】:2011-11-07 17:06:48
【问题描述】:

我们有一个包含所有数据合同的合同程序集。我们正在使用 JSON.net 将我们的数据合约序列化为 json。

JSON.Net 在序列化的 $type 属性中添加类型名称和程序集名称。由于我们所有的数据合约都在同一个程序集中,总是加载在当前应用程序域中,我们应该可以省略它。

我们怎样才能做到这一点?

谢谢

【问题讨论】:

  • 你是怎么调用序列化的?

标签: json json.net


【解决方案1】:

您可以在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);
}

【讨论】:

    【解决方案2】:

    我想也许可以用JsonObjectAttribute标记这个类

    [DataContract]
    [JsonObject("")]
    public class MyContractClass { ... }
    

    这应该覆盖它也是一个 DataContract 的事实。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多