C# 将数组数组序列化为单个XML元素

C# 将数组数组序列化为单个XML元素,c#,xml,serialization,C#,Xml,Serialization,我有一个领域: public Field[][] fields; 我想要一个XML: <Fields> <Field x="0" y="0"> ... </Field> <Field x="0" y="1"> ... </Field> ... </Fields> ... ... ... 不幸的是,C#XmlSerializer给了我 <Fiel

我有一个领域:

public Field[][] fields;
我想要一个XML:

<Fields>
    <Field x="0" y="0">
       ...
    </Field>
    <Field x="0" y="1">
       ...
    </Field>
    ...
</Fields>

...
...
...
不幸的是,C#XmlSerializer给了我

<Fields>
    <ArrayOfField>
        .... some fields here
    </ArrayOfField>
    <ArrayOfField>
       .... some here
    </ArrayOfField>
            ...
</Fields>

.... 这里有些田地
.... 这里有些
...
我如何做到这一点



实际上,我不需要坚持使用数组。这些字段确实表示二维空间,因此这是一种自然选择。一个
字典
会按照我需要的方式序列化吗?

我认为您需要实现IXmlSerializable接口:


然后,您可以在
WriteXml()
方法中指定xml的写入(格式化)方式。

您可以创建一个属性,在数组数组和单个数组之间进行转换:

using System.Linq;

...

[XmlIgnore]
public Field[][] Fields;

[XmlArray("Fields")]
public Field[] SerializedFields
{
    get
    {
        return this.Fields.SelectMany(fields => fields).ToArray();
    }
    set
    {
        this.Fields = new Field[value.Max(field => field.x) + 1][];
        for (int x = 0; x < this.Fields.Length; x++)
        {
            this.Fields[x] = value.Where(field => field.x == x).ToArray();
        }
    }
}
使用System.Linq;
...
[XmlIgnore]
公共字段[][]字段;
[XmlArray(“字段”)]
公共字段[]序列化字段
{
得到
{
返回this.Fields.SelectMany(Fields=>Fields.ToArray();
}
设置
{
this.Fields=newfield[value.Max(Field=>Field.x)+1]];
for(int x=0;xfield.x==x.ToArray();
}
}
}

您能告诉我们x和y属性的填充位置吗。您可以使用xslt transform转换xml。我没有给出所有详细信息,x和y是
Field
类的公共字段,并且映射到属性。
字段
类序列化正常。我只是找不到一种方法来序列化二维数组,既不是多维数组,也不是交错数组。我考虑过这一点,但你会如何反序列化它..?请参阅我更新的答案。它假设了几件事:
x
y
属性与数组索引匹配;
x
中可能存在间隙;对于给定的
x
y
中没有间隙(即,如果
字段[9][3]
存在,那么
字段[9][0]
字段[9][1]
字段[9][2]
也存在间隙);可以在每个数组的末尾删除未使用的元素。太好了。正是我需要的。