2012-08-23 36 views
1

我的.NET XML序列化存在问题。 如果我在没有特定标签的情况下反序列化XML,并将这个对象序列化回XML,那么这些标签中的一些将被跳过。无参数构造函数将这些属性设置为默认值,并且它们同时具有getter和setter。如果未初始化,.NET XML序列化标记丢失

只有int属性被跳过,String被序列化。

输入文件:

<FileList> 
    <File> 
    <FilePath>RE.msg</FilePath> 
    </File> 
</FileList> 

输出文件:

<FileList GUID="A13EDDDF-F55A-4540-A776-609245B92D83" Created="2012-08-23T09:46:30+03:00"> 
    <File GUID="28C6E090-A3D5-4CD7-97A6-7A46F2F0DDF7" Created="2012-08-23T09:46:30+03:00"> 
    <FilePath>RE.msg</FilePath> 
    <FileStamp>wjoeao1x.msg</FileStamp> 
    <StatusMessage>Created</StatusMessage> 
    </File> 
</FileList> 

无参数的构造函数值int财产Status,但它没有被序列:

public CT_File() 
{ 
    Status = 1; 
    StatusMessage = "Created"; 
} 

类定义。它是从XSD架构自动生成的。

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")] 
[System.SerializableAttribute()] 
//[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
public partial class CT_File : CT_Base { 

    private string filePathField; 

    private string descriptionField; 

    private string fileStampField; 

    private string kapprisIDField; 

    private int statusField; 

    private bool statusFieldSpecified; 

    private string statusMessageField; 

    private int errorCodeField; 

    private bool errorCodeFieldSpecified; 

    private string errorMessageField; 

    private CT_FileList attachmentsField; 

    private string originalIDField; 

    public CT_File() 
    { 
     Status = 1; 
     StatusMessage = "Created"; 
     this.attachmentsField = new CT_FileList(); 
    } 

    /// <remarks/> 
    public string FilePath { 
     get { 
      return this.filePathField; 
     } 
     set { 
      this.filePathField = value; 
     } 
    } 

    /// <remarks/> 
    public string Description { 
     get { 
      return this.descriptionField; 
     } 
     set { 
      this.descriptionField = value; 
     } 
    } 

    /// <remarks/> 
    public string FileStamp { 
     get { 
      return this.fileStampField; 
     } 
     set { 
      this.fileStampField = value; 
     } 
    } 

    /// <remarks/> 
    public string KapprisID { 
     get { 
      return this.kapprisIDField; 
     } 
     set { 
      this.kapprisIDField = value; 
     } 
    } 

    /// <remarks/> 
    public int Status { 
     get { 
      return this.statusField; 
     } 
     set { 
      this.statusField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool StatusSpecified { 
     get { 
      return this.statusFieldSpecified; 
     } 
     set { 
      this.statusFieldSpecified = value; 
     } 
    } 

    /// <remarks/> 
    public string StatusMessage { 
     get { 
      return this.statusMessageField; 
     } 
     set { 
      this.statusMessageField = value; 
     } 
    } 

    /// <remarks/> 
    public int ErrorCode { 
     get { 
      return this.errorCodeField; 
     } 
     set { 
      this.errorCodeField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool ErrorCodeSpecified { 
     get { 
      return this.errorCodeFieldSpecified; 
     } 
     set { 
      this.errorCodeFieldSpecified = value; 
     } 
    } 

    /// <remarks/> 
    public string ErrorMessage { 
     get { 
      return this.errorMessageField; 
     } 
     set { 
      this.errorMessageField = value; 
     } 
    } 

    /// <remarks/> 
    public CT_FileList Attachments { 
     get { 
      return this.attachmentsField; 
     } 
     set { 
      this.attachmentsField = value; 
     } 
    } 

    /// <remarks/> 
    public string OriginalID { 
     get { 
      return this.originalIDField; 
     } 
     set { 
      this.originalIDField = value; 
     } 
    } 
} 
+0

我们可以看到与“Status”和“StatusMessage”有关的属性/字段吗? –

回答

4

的XmlSerializer只序列公共字段/属性和属性:只有当他们同时拥有一个getter和setter。例如:

private int Status; 

未被序列,也不是:

private int status; 
public int Status { get { return status; } } 

或:

private int status; 
public int Status { get { return status; } private set { status = value; } } 

或:

public int Status { get; protected set; } 

此外,成员不是串行化,如果他们标记为[XmlIgnore],或者如果有匹配的基于名称的图案的方法:

public bool ShouldSerializeStatus() { return false; } 

存在这样的工作原理相同的第二图案,但允许2路检查(即“我应该序列化这个?”和“没有这个反序列化过程中获得价值?”):

[XmlIgnore] 
public bool StatusSpecified { get {...} set {...} } 

此外,匹配其明确的默认,价值观是没有序列号:

[DefaultValue(1)] 
public int Status { get; set; } // won't serialize if ===1 

我的猜测是,它不是序列化的一个以上原因。

+0

感谢您的很多提示。我在我的问题中添加了完整的类代码。不幸的是,你的笔记都不适用于代码。 “状态”只是一个公共财产,无论是获得者还是设置者。 – keaukraine

+0

@keaukraine啊,我应该注意到:'StatusSpecified'和'ShouldSerializeStatus()'的作用相同。你的代码有一个'StatusSpecified'。我将编辑澄清。但是:将其设置为true,或者更简单:将其删除。 –

+0

谢谢@MarcGravell。辅助功能修饰符是关键。 –