簡體   English   中英

通過跳過C#中的父級從XML元素反序列化值

[英]Deserialize value from XML-element by skipping parent in C#

假設我有一個XML文件的一部分,該文件的矩陣布局與此類似:

XML矩陣

<matrix>
 <row1>
   <col1>1.00</col1>
   <col2>0.00</col2>
   <col3>1.00</col3>
   <col4>1.00</col4>
 </row1>
 <row2>
   <col1>0.00</col1>
   <col2>1.00</col2>
   <col3>1.00</col3>
   <col4>0.00</col4>
 </row2>
</matrix>

並說id喜歡以這樣的結構結尾:

所需結構

public struct sMatrix
{
    public float m11;
    public float m12;
    public float m13;
    ...
    public float m23;
    public float m24;
}

我應該如何聲明此結構能夠通過XmlSerializer反序列化? 我是否可以在結構中給浮點數一些Xml屬性以告訴他們,例如m11是row1的子級? 我試過這個: [XmlElement("matrix/row1/col1")但是沒有用。

好吧,您可以將矩陣結構的所有字段標記為不可序列化,並引入“行”結構對行進行序列化和反序列化,如下所示:

[Serializable]
public struct sMatrixRow
{
    public sMatrixRow(float col1, float col2, float col3, float col4)
    {
        this.col1 = col1;
        this.col2 = col2;
        this.col3 = col3;
        this.col4 = col4;
    }
    public float col1;
    public float col2;
    public float col3;
    public float col4;
}

[Serializable]
public struct sMatrix
{
    [XmlElement("row1")]
    public sMatrixRow Row1
    {
        get
        {
            return new sMatrixRow(m00, m01, m02, m03);
        }
        set
        {
            this.m00 = value.col1;
            this.m01 = value.col2;
            this.m02 = value.col3;
            this.m03 = value.col4;
        }
    }

    // And so on, for Rows 2 through 4

    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m00;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m01;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m02;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m03;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m10;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m11;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m12;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m13;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m20;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m21;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m22;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m23;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m30;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m31;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m32;
    [System.NonSerialized, System.Xml.Serialization.XmlIgnore]
    public float m33;
}

更新:此方案成功地對包含類中的以下“矩陣”字段進行了序列化和反序列化:

  <matrix>
    <row1>
      <col1>2</col1>
      <col2>0</col2>
      <col3>0</col3>
      <col4>0</col4>
    </row1>
    <row2>
      <col1>0</col1>
      <col2>2</col2>
      <col3>0</col3>
      <col4>0</col4>
    </row2>
    <row3>
      <col1>0</col1>
      <col2>0</col2>
      <col3>2</col3>
      <col4>0</col4>
    </row3>
    <row4>
      <col1>0</col1>
      <col2>0</col2>
      <col3>0</col3>
      <col4>1</col4>
    </row4>
  </matrix>

那是你要的嗎?

更新:將[XmlElement(“ row1”)]添加到Row1(其他行也類似)以小寫行名。 我在這里所做的基本上是使用可序列化的屬性來創建數據的XML可見表示形式,該表示形式與基礎字段不同,但同構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM