2012-03-31 77 views
3

我有一个字段:序列化数组的数组作为一个单一的XML元素

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> 

我该如何做到这一点?嗯,其实我不需要坚持阵列的数组。这些字段确实代表了2D空间,所以这是一个很自然的选择。我会需要一个Dictionary序列化吗?

+0

你能告诉我们这个x和y属性被填充的位置。你可以使用xslt变换来转换你的xml – naveen 2012-03-31 16:23:32

+0

我没有给出所有的细节,x和y是Field类的公共字段并被映射到属性。 “Field”类序列化没问题。我只是无法找到序列化2d数组的方法,既不是多维数组,也不是锯齿状的数组。 – emesx 2012-03-31 16:29:21

回答

2

您可以创建数组的数组和单个阵列之间进行转换的属性:

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(); 
     } 
    } 
} 
+0

我想过这个,但你将如何反序列化它..? – emesx 2012-03-31 16:35:18

+2

查看我更新的答案。它假设了几件事情:'''x'和'''属性匹配数组索引; 'x'中可能存在空白;对于给定的'x','y'中没有空格(也就是说,如果存在Fields [9] [3]',Fields [9] [0]',Fields [9] [1] ]'和Fields [9] [2]');可以在每个阵列的末尾放置未使用的元素。 – 2012-03-31 16:53:55

+0

**很棒**。完全是我需要的。 – emesx 2012-03-31 17:03:17

相关问题