2016-11-14 74 views
0

我在这里有关于反序列化的问题。我有一个XML文件,我需要将它反序列化到从Service引用中获得的类中。我知道如何反序列化一个XML文件,但是当我尝试反序列化这个文件时,我得到一个空的类对象。我不明白为什么这样做。C#中的XML反序列化返回一个空对象

的XML文件中的内容是这样的:

<?xml version="1.0" encoding="UTF-8" ?><iVAZFile xmlns="http://www.v.lt/c/i/iv"> 
<FileDescription> 
<FileVersion>i1.3.3</FileVersion> 
<FileDateCreated>2016-11-07T12:28:32</FileDateCreated> 
<SoftwareCompanyName>otechnika&quot;</SoftwareCompanyName> 
<SoftwareName>Eita</SoftwareName> 
<SoftwareVersion>2016.9</SoftwareVersion> 
<CreatorRegistrationNumber>123060356</CreatorRegistrationNumber> 
</FileDescription> 
</iVAZFile> 

类看起来是这样的:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1590.0")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.v.lt/c/i/iv")] 
    public partial class FileDescription : object, System.ComponentModel.INotifyPropertyChanged { 

     private string fileVersionField; 

     private System.DateTime fileDateCreatedField; 

     private string softwareCompanyNameField; 

     private string softwareNameField; 

     private string softwareVersionField; 

     private ulong creatorRegistrationNumberField; 

     public FileDescription() { 
      this.fileVersionField = "iVAZ1.3.3"; 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Order=0)] 
     public string FileVersion { 
      get { 
       return this.fileVersionField; 
      } 
      set { 
       this.fileVersionField = value; 
       this.RaisePropertyChanged("FileVersion"); 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Order=1)] 
     public System.DateTime FileDateCreated { 
      get { 
       return this.fileDateCreatedField; 
      } 
      set { 
       this.fileDateCreatedField = value; 
       this.RaisePropertyChanged("FileDateCreated"); 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Order=2)] 
     public string SoftwareCompanyName { 
      get { 
       return this.softwareCompanyNameField; 
      } 
      set { 
       this.softwareCompanyNameField = value; 
       this.RaisePropertyChanged("SoftwareCompanyName"); 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Order=3)] 
     public string SoftwareName { 
      get { 
       return this.softwareNameField; 
      } 
      set { 
       this.softwareNameField = value; 
       this.RaisePropertyChanged("SoftwareName"); 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Order=4)] 
     public string SoftwareVersion { 
      get { 
       return this.softwareVersionField; 
      } 
      set { 
       this.softwareVersionField = value; 
       this.RaisePropertyChanged("SoftwareVersion"); 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Order=5)] 
     public ulong CreatorRegistrationNumber { 
      get { 
       return this.creatorRegistrationNumberField; 
      } 
      set { 
       this.creatorRegistrationNumberField = value; 
       this.RaisePropertyChanged("CreatorRegistrationNumber"); 
      } 
     } 

     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) { 
      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
      if ((propertyChanged != null)) { 
       propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

而且我使用填充类中的方法:

using (MemoryStream memoryStream = new MemoryStream()) 
      { 
       using (BinaryWriter binWriter = new BinaryWriter(memoryStream, Encoding.UTF8)) 
       { 
        string filep = File.ReadAllText("test.xml"); 
        binWriter.Write(filep); 
        memoryStream.Seek(2, SeekOrigin.Begin); 
        using (StreamReader streamReader = new StreamReader(memoryStream)) 
        { 
         using (XmlReader reader = XmlReader.Create(streamReader)) 
         { 
          XmlRootAttribute xRoot = new XmlRootAttribute(); 
          xRoot.ElementName = "FileDescription"; 
          xRoot.IsNullable = false; 
          XmlSerializer serializer = new XmlSerializer(typeof(FileDescription),xRoot); 
          FileDescription dsc = new FileDescription(); 
          dsc=(FileDescription)serializer.Deserialize(reader); 
         } 
        } 
       } 
       } 

一些额外的评论说我也试过:

  1. 我做了我自己的班级,看起来与服务参考中的一样,并添加了一个新参数[XmlRoot(ElementName="FileDescription"),XmlType("FileDescription")] 然后在我的班级上进行了deserilization。
  2. 尝试用手工添加数值而不使用可以正常工作的值,所以服务代码没有问题。
  3. 另外,当我反序列化的XML我删除<iVAZFile xmlns="http://www.v.lt/c/i/iv"></iVAZFIle>因为当反序列化它会抛出异常并不期待。

最后几个字我不能改变服务引用类,我需要使用该类以备后用,所以我不能做我自己的。

+1

反向操作 - 创建一个对象并对其进行序列化。你会更容易发现差异在哪里。对于我来说,你试图使用需要'FileDescription'的某个'iVAZFile'元素进行反序列化。 –

+0

是的,我忘了补充一点,我也删除,因为当反序列化它会抛出异常“不期待

+0

您是否将名称空间('xmlns'属性)添加回到'FileDescription'?如果不是,他们将不匹配。 –

回答

1

区别在于命名空间 - 根据FileDescription类的XmlType属性,命名空间为http://www.v.lt/c/i/iv。这适用于FileDescription的所有子元素。根名称空间是您通过XmlRootAttribute或采用默认名称空间的构造函数配置的任​​何内容。

正如我所建议的那样,调试这种问题最简单的方法是做一个反例 - serialise一个对象,看看它是什么样子。正如您在this fiddle中看到的那样,目前的输出将如下所示。这就是为什么你没有得到任何错误(因为根类匹配),但是你正在反序列化的XML中的所有子元素都在错误的名称空间中。

<FileDescription> 
    <FileVersion xmlns="http://www.v.lt/c/i/iv">iVAZ1.3.3</FileVersion> 
    <FileDateCreated xmlns="http://www.v.lt/c/i/iv">0001-01-01T00:00:00</FileDateCreated> 
    <CreatorRegistrationNumber xmlns="http://www.v.lt/c/i/iv">0</CreatorRegistrationNumber> 
</FileDescription> 

如果指定根相同的命名空间中this fiddle,输出看起来是这样的:

<FileDescription xmlns="http://www.v.lt/c/i/iv"> 
    <FileVersion>iVAZ1.3.3</FileVersion> 
    <FileDateCreated>0001-01-01T00:00:00</FileDateCreated> 
    <CreatorRegistrationNumber>0</CreatorRegistrationNumber> 
</FileDescription> 

你需要保持你的命名空间修改文件内。你可以在this fiddle看到这个作品。

+0

谢谢你解决了我的问题 –

0

(发表于OP)

由Charles Mager解决了这个问题。问题是,我不得不将命名空间添加到每个值在我的XML所以它必须是这样的:

<FileDescription> 
<FileVersion xmlns="http://www.v.lt/c/i/iv">i1.3.3</FileVersion> 
<FileDateCreated xmlns="http://www.v.lt/c/i/iv">2016-11-07T12:28:32</FileDateCreated> 
<SoftwareCompanyName xmlns="http://www.v.lt/c/i/iv">otechnika&quot;</SoftwareCompanyName> 
<SoftwareName xmlns="http://www.v.lt/c/i/iv">Eita</SoftwareName> 
<SoftwareVersion xmlns="http://www.v.lt/c/i/iv">2016.9</SoftwareVersion> 
<CreatorRegistrationNumber xmlns="http://www.v.lt/c/i/iv">123060356</CreatorRegistrationNumber> 
</FileDescription> 

现在工作得很好,感谢您的帮助。