C# DataMember 序列化器排序与预期相反
Posted
技术标签:
【中文标题】C# DataMember 序列化器排序与预期相反【英文标题】:C# DataMember Serializer Ordering Opposite of Expected 【发布时间】:2013-11-29 01:47:12 【问题描述】:根据本文,当序列化为 JSON 时,我希望在字段列表的顶部看到基类中的字段。但是,我看到列表底部的字段。实际类本身的顺序是正确的,但层次结构中的顺序不正确。
正在发生的事情是它与班级正确排序,它正在做与我期望的完全相反的事情。我希望基类首先对其字段进行序列化。我不想使用 Order=X 属性,因为我的对象中有太多字段。
这与此处描述的行为完全相反:
http://msdn.microsoft.com/en-us/library/ms729813(v=vs.110).aspx
[DataContract]
public class MyBase
[DataMember]
public long Id get; set;
[DataContract]
public class MyChild : MyBase
[DataMember]
public string Field1 get; set;
[DataMember]
public string Field2 get; set;
[DataMember]
public string Field3 get; set;
[DataContract]
public class MySecondChild : MyChild
[DataMember]
public string SecondField get; set;
在序列化 MySecondChild 的实例时...
预期
"Id": 1,
"Field1": "f1",
"Field2": "f2",
"Field3": "f3",
"SecondField": "s1"
实际
"SecondField": "s1",
"Field1": "f1",
"Field2": "f2",
"Field3": "f3",
"Id": 1
【问题讨论】:
我认为这是因为缺少[KnownType]
,但实际上我认为可能很简单:您正在阅读的关于DataMember
的内容仅适用于@987654327 @.
如何判断我使用的是 DataContractSerializer 还是其他东西?绝对看起来很奇怪,因为我明确地扩展了基类。
好吧,你目前如何序列化它们?您通过什么机制从对象获取到 json?提示:它肯定不是 DataContractSerializer
,因为它不是 JSON 序列化器
我正在使用内置于 JSON 序列化程序的 ASP.NET Web API。我从全局配置中删除了 XML 格式化程序,以便始终将内容序列化为 JSON。我不太确定如何判断我正在使用什么实现。有什么建议吗? (我同意你的观点,那么它一定不是 DataContractSerializer,因为我专门去 JSON)
取决于 MVC 版本,默认为 javascriptSerializer
或 JSON.NET;我查过了,JavaScriptSerializer
似乎不太服从Order
...
【参考方案1】:
为我工作:http://pastebin.com/PqBEHf6g
"Id":1,"Field1":"f1","Field2":"f2","Field3":"f3","SecondField":"s1"
【讨论】:
AFAIK,MVC 不使用DataContractJsonSerializer
作为默认值
感谢您的回答。我想也许 ASP.NET Web Api 使用的序列化器不是同一个序列化器?我怎么知道这里?
我不知道,请阅读文档,抱歉 :)。也许是 Newtonsoft.Json?如果您观察到不同的行为,那么您一定不能使用 DataContract 的东西,因此 MSDN 文档不适用于您,而且您也不应该使用 [Data*] 属性。
我认为它默认使用Newtonsoft.Json?根据这个无论如何...asp.net/web-api/overview/formats-and-model-binding/… -- 它是这样工作的,但是它添加了一个 _type 属性,并且要求我使用 [KnownType] 这也很尴尬。以上是关于C# DataMember 序列化器排序与预期相反的主要内容,如果未能解决你的问题,请参考以下文章
配置 JSON.NET 以忽略 DataContract/DataMember 属性
protobuf-net 不使用私有设置器序列化 C# 属性
从 XML 文档创建的 Json 反序列化到 POCO 不适用于数组
如何在 WCF 中使用 DataContract/DataMember 序列化 Func<int, int>(甚至是一般委托)类型字段