简体   繁体   English

需要帮助以使用C#DataContract反序列化器反序列化xml数据

[英]Need help to deserialize xml data using c# datacontract deserializer

I am trying to deserialize XMl using Datacontract deserializer. 我正在尝试使用Datacontract反序列化器反序列化XMl。

 <?xml version="1.0" encoding="utf-8"?>
 <Invoice>
 <Samples>
    <Sample>
      <AccountId>1e547ae6-9a6d-d18f-958b-22000b83a845</AccountId>
      <AccountNumber>55761598808</AccountNumber>
    </Sample>
     <Sample>
       <AccountId>1e547ae6-9a6d-d18f-958b-22000b83a845</AccountId>
       <AccountNumber>55761598808</AccountNumber>
    </Sample>
  </Samples>
</Invoice>

I have defined the below classes to deserialize 我定义了以下类来反序列化

        [DataContract(Name = "Sample", Namespace = "")]
         public class Sample
         {
             [DataMember(Name = "AccountId")]
             public string AccountId { get; set; }
             [DataMember(Name = "AccountNumber")]
             public string AccountNumber { get; set; }
         }

         [DataContract(Name = "Samples", Namespace = "")]
         public class Samples
         {
             [DataMember(Name = "Sample")]
             public List<Sample> Sample { get; set; }
         }

         [DataContract(Name = "Invoice", Namespace = "")]
         public class Invoice
         {
             [DataMember(Name = "Samples")]
             public Samples Samples { get; set; }
         }

   And the test method to deserialize
    [TestMethod]
    public void SampleXmlTest()
    {  
        string fileName = @"C:\Users\SJuluru\Desktop\Sample      XML\Samplexml_Modified.xml";
        FileStream fs = new FileStream(fileName,  FileMode.Open);
        XmlDictionaryReader reader =
        XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
        DataContractSerializer ser = new DataContractSerializer(typeof(CommonAvidXmlDto.Invoice));
        CommonAvidXmlDto.Invoice deserializedInvoice =        (CommonAvidXmlDto.Invoice)ser.ReadObject(reader, true);
        reader.Close();
        fs.Close();
     }

When I ran the method in debug mode, deserializedInvoice object got null and no data from XML is copied. 当我在调试模式下运行该方法时,deserializedInvoice对象为空,并且不会复制XML中的数据。 Please suggest me a solution to solve this 请为我建议解决方案

The easiest way to see where you have problems in deserialization is to serialize an example of your class and compare the result with the expected result. 查看反序列化问题的最简单方法是序列化类的示例,然后将结果与预期结果进行比较。 For example, if I create an Invoice as follows: 例如,如果我按以下方式创建Invoice

        var invoice = new Invoice 
        { 
            Samples = new Samples { Sample = new List<Sample> { new Sample { AccountId = "1e547ae6-9a6d-d18f-958b-22000b83a845", AccountNumber = "55761598808" } } } 
        };

This serializes to the following XML: 这将序列化为以下XML:

 <Invoice xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <Samples> <Sample> <Sample> <AccountId>1e547ae6-9a6d-d18f-958b-22000b83a845</AccountId> <AccountNumber>55761598808</AccountNumber> </Sample> </Sample> </Samples> </Invoice> 

As you can see, there's an extra level of <Sample> nesting. 如您所见,还有一个额外的<Sample>嵌套层。 Thus your intermediate Samples class is unnecessary. 因此,您的中间Samples类是不必要的。 You can deserialize your XML using DataContractSerializer with just the following two classes: 您可以使用DataContractSerializer对以下两个类进行反序列化XML:

[DataContract(Name = "Sample", Namespace = "")]
public class Sample
{
    [DataMember(Name = "AccountId")]
    public string AccountId { get; set; }
    [DataMember(Name = "AccountNumber")]
    public string AccountNumber { get; set; }
}

[DataContract(Name = "Invoice", Namespace = "")]
public class Invoice
{
    [DataMember(Name = "Samples")]
    public List<Sample> Samples { get; set; }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM