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# 属性

JSON序列化与反序列化

从 XML 文档创建的 Json 反序列化到 POCO 不适用于数组

C# 的三种序列化方法

如何在 WCF 中使用 DataContract/DataMember 序列化 Func<int, int>(甚至是一般委托)类型字段