为了账号安全,请及时绑定邮箱和手机立即绑定

DataContractSerializer - 不反序列化子列表 - List<T>

DataContractSerializer - 不反序列化子列表 - List<T>

C#
明月笑刀无情 2021-11-07 19:27:45
我正在尝试使用 DataContractSerializer 反序列化以下 XML。<?xml version="1.0" encoding="utf-8"?><order>  <header>    <cust>1</cust>    <bill>2</bill>    <ship>3</ship>    <nbr>123456</nbr>  </header>  <details>    <detail>      <nbr>123456</nbr>      <part>1227</part>      <qty>2</qty>    </detail>  </details></order>我在反序列化子<detail></detail>段时遇到了困难,这始终是null. 我的班级结构如下:[DataContract(Name = "order", Namespace ="")]public class Order{    [DataMember(Name = "header", Order = 0)]    public Head head { get; set; }    [DataMember(Name = "details", Order = 1)]    public Details details { get; set; }    public Order()    {    }}[DataContract(Name = "header", Namespace ="")]public class Head{    [DataMember(Name = "cust", Order = 0)]    public string customerNbr { get; set; }    [DataMember(Name = "bill", Order = 1)]    public string billNbr { get; set; }    [DataMember(Name = "ship", Order = 2)]    public string shipmentNbr { get; set; }    [DataMember(Name = "nbr", Order = 3)]    public string orderNbr { get; set; }    public Head()    {    }}[DataContract(Name = "details")]public class Details{    [DataMember(Name = "detail", Order = 0)]    public List<Detail> DetailList { get; set; }    public Details()    {        this.DetailList = new List<Detail>();    }}[DataContract(Name = "detail")]public class Detail{    [DataMember(Name = "nbr", Order = 0)]    public string orderNbr { get; set; }    [DataMember(Name = "part", Order = 1)]    public string partNbr { get; set; }    [DataMember(Name = "qty", Order = 2)]    public decimal orderQty { get; set; }    public Detail()    {    }}在我的主程序中,我正在阅读 XML 文档并使用以下内容对其进行反序列化:XDocument readDoc = XDocument.Load(fileName);Order createOrder = null;DataContractSerializer ser = new DataContractSerializer(typeof(Order));createOrder = (Order)ser.ReadObject(readDoc.CreateReader());我该怎么做才能使详细信息段正确反序列化?
查看完整描述

1 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

问题是您的数据协定类与实际 xml 结构所需的不同。


您可以通过对模型进行小幅修改来解决此问题。


设置Detail类的命名空间以匹配其他类中的命名空间,即:空白值。

[DataContract(Name = "detail", Namespace = "")]

public class Detail

{

    //same stuff here...

}

使您的 Details 类成为数据协定的集合。

[CollectionDataContract(Name = "details", Namespace = "")]

public class Details : Collection<Detail> { }

您可以查看此以获取有关集合和数据协定序列化的更多详细信息。


希望这可以帮助!


查看完整回答
反对 回复 2021-11-07
  • 1 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信