【问题标题】:Deserialize value from XML-element by skipping parent in C#通过在 C# 中跳过父级来反序列化 XML 元素中的值
【发布时间】:2014-07-04 08:47:01
【问题描述】:

假设我有一个 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"),但没用。

【问题讨论】:

  • 如果列数不是静态的(不总是 4),我会向您推荐另一种数据结构。您不能在运行时添加属性。
  • 它们是静态的,实际矩阵是 6x6,虽然不想写那么多 xml :)

标签: c# serialization deserialization xmlserializer


【解决方案1】:

好吧,您可以将矩阵结构的所有字段标记为不可序列化,并引入“行”结构来序列化和反序列化您的行,如下所示:

[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 可见表示。

【讨论】:

  • 好吧,我确实希望它反序列化一个我无法控制布局的 XML。所以在这种情况下,我并不关心实际的序列化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多