【发布时间】:2016-09-08 08:33:47
【问题描述】:
我有一堆我序列化的域对象,发送到其他应用程序,然后使用Json.Net 反序列化。这些对象可能具有以下属性
- 定义为具有多个派生类的抽象基类
- 动态属性
我使用了TypeNameHandling.Auto,它将$type 属性添加到与声明类型不同的类型。然而,这个设置对我的动态属性有一个不想要的副作用,即它们的类型也被声明了。
在下面的示例中,model 是我的 C# 代码中定义为 public dynamic Model { get; set; } 的动态属性。
"model":{"$type":"<>f__AnonymousType0`3[[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib]], ExampleAssembly","link":"http://www.google.com","name":"John"}
当试图在另一个程序集中反序列化这个字符串时,Json.Net(当然)找不到ExampleAssembly。使用TypeNameHandling.None 属性给出以下属性序列化
"model": {"link":"http://www.google.com","name":"John"}
可以成功反序列化为dynamic。但是,这会破坏派生类型的反序列化。
关于如何在不实现自定义 IContractResolver 和可能的其他自定义代码的情况下使其工作的任何想法?
我不拥有域对象,所以我不能用属性装饰它们或它们的属性或允许它们实现接口等。我正在寻找的是序列化程序中省略类型的某种设置dynamics.
恕我直言,这应该可以通过设置以某种方式进行配置,我只是还没找到。
【问题讨论】:
-
[JsonIgnore] 或条件序列化 (newtonsoft.com/json/help/html/conditionalproperties.htm) 可能有用
-
@Nair:谢谢,但不幸的是没有。我不拥有域对象,因此无法使用属性或方法进行装饰。此外,这不能很好地扩展,因为我必须对所有对象都这样做。
-
将
[JsonProperty(TypeNameHandling = TypeNameHandling.None)]添加到相关属性将是最直接的方法 - 但在您的评论中您说您不能这样做。你可能想edit这个问题来澄清这个要求。 -
@dbc 此外,我不确定我是否同意这是最直接的,因为我必须(如果我能够)将此属性添加到数百个属性中(并继续将它们添加为引入了新类)。在我看来,序列化信息属于序列化器,而不是它们序列化的对象。
-
如果您无法更改您的类型,那么自定义合同解析器似乎是解决方案 - 但您的问题表明您不希望这样做。
标签: c# .net json serialization json.net