【问题标题】:C# DataMember Serializer Ordering Opposite of ExpectedC# DataMember 序列化器排序与预期相反
【发布时间】: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...

标签: c# serialization jsonserializer datamember datacontractjsonserializer


【解决方案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] 这也很尴尬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多