使用包括数组元素索引的数组属性序列化类

时间:2017-07-12 12:26:32

标签: c# xml serialization xml-serialization

我有一个班级

public class clsTest
{
     public string name;

    [XmlArray(ElementName = "values")]
    [XmlArrayItem(ElementName = "value")]
    public float[] values;

    public clsTest()
    {
        name = "name-test";
        values = new float[4];
        values[0] = 0.9F;
        values[1] = 1.1F;
        values[2] = 2.2F;
        values[3] = 3.3F;
    }
}

当我序列化课程时,我得到了:

<clsTest>
    <name>name-test</name>

    <values>
          <value>0.9</value>
          <value>1.1</value>
          <value>2.2</value>
          <value>3.3</value>
    </values>

</clsTest>

我想序列化类,并在XML输出中将数组索引作为Attribute。我想要这样的东西:

<clsTest>
    <name>name-test</name>

    <values>
      <value index="0">0.9</value>
      <value index="1">1.1</value>
      <value index="2">2.2</value>
      <value index="3">3.3</value>
    </values>
</clsTest>

我怎么能实现这个目标?

1 个答案:

答案 0 :(得分:0)

没有魔法可以为你做到这一点。如果您有一个看起来像这样的对象结构,那么您获得该输出的唯一方法就是如此。例如:

public class ClsTest
{
    [XmlElement("name")]
    public string Name { get; set; }

    [XmlArray("values")]
    [XmlArrayItem("value")]
    public IndexedFloat[] Values { get; set; }
}

public class IndexedFloat
{
    [XmlAttribute("index")]
    public int Index { get; set; }

    [XmlText]
    public float Value { get; set; }
}

您可以添加另一个属性,以便轻松获取和设置原始float值:

[XmlIgnore]
public IEnumerable<float> ValuesRaw
{
    get { return Values.Select(x => x.Value); }
    set
    {
        Values = value
            .Select((x, i) => new IndexedFloat {Index = i, Value = x})
            .ToArray();
    }
}

您可以在this fiddle中看到您获得了所需的输出。