1

.NET XML シリアル化に問題があります。特定のタグなしで XML をデシリアライズし、このオブジェクトを XML にシリアライズすると、これらのタグの一部がスキップされます。パラメーターなしのコンストラクターは、これらのプロパティを既定値に設定し、getter と setter の両方を持ちます。

属性のみ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;
        }
    }
}
4

1 に答える 1

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

私の推測では、上記の理由のいずれかでシリアル化されていません。

于 2012-08-23T07:12:00.627 に答える