2009-02-16 116 views
4

我在尝试通过XmlSerializer为我正在处理的XNA项目序列化多维数组的整数时遇到问题。我可以序列化所有其他数据(布尔值,字符串,甚至颜色等)。我也看到很多人声称XmlSerializer会自然地处理(单维)整数数组。对于多维数组是否存在限制,或者是否有其他事情正在进行?使用XmlSerializer对整数数组进行序列化

下面是相关代码:

int[,,] scoredata = scores; // Populated with data elsewhere 

filename = Path.Combine(container.Path, "scoredata.sav"); 
stream = File.Open(filename, FileMode.Create); 
serializer = new XmlSerializer(typeof(int[,,])); 
serializer.Serialize(stream, scoredata); // This line throws the exception. 
stream.Close(); 

我收到的例外是“类型的未处理的异常‘System.InvalidOperationException’发生在system.xml.dll的有差错的XML文档。”我也尝试使用这个数组作为结构中的成员变量(其中我所有的其他玩家数据都存储在这里),但是当我这样做时,我也得到了同样的异常,这导致我相信这不是一个简单的语法错误或类似的东西。

我是否需要重构我的代码以通过单维数组进行序列化,还是存在某些我忽略的内容?

在此先感谢!

回答

12

阅读内的例外:

  • 有反射型 'SOMETYPE' 错误。无法序列化类型为'System.Int32 [,,]'的成员'SomeType.Data',有关更多详细信息,请参阅内部异常。
  • 无法序列化System.Int32 [,,]类型的对象。多维数组不受支持。

因此,不支持多维数组。您可能必须要垫片它作为一维数组...你可以有一个单独的属性,做翻译做到这一点:

[XmlIgnore] 
public int[, ,] Data { get; set; } 

[XmlElement("Data"), Browsable(false)] 
[EditorBrowsable(EditorBrowsableState.Never)] 
public int[] DataDto 
{ 
    get { /* flatten from Data */ } 
    set { /* expand into Data */ } 
} 
+0

这就是我期待的答案。谢谢! – CloudyMusic 2009-02-16 16:17:46

0

我花了一段时间来弄清楚什么应该进入Marc的获取并设置大括号来展平和展开多维数组。

这是我对二维数组的解决方案。

在我的情况,我知道在编译时,其中一个维度是4,所以我不必存储(以某种方式)数组维度。

[XmlIgnore] 
    public int[,] Readings { get; set; } 
    [XmlArray("Readings")] 
    public int[] ReadingsDto { 
     get { return Flatten(Readings); } 
     set { Readings = Expand(value, 4); } 
    } 

    public static T[] Flatten<T>(T[,] arr) 
    { 
     int rows0 = arr.GetLength(0); 
     int rows1 = arr.GetLength(1); 
     T[] arrFlattened = new T[rows0 * rows1]; 
     for (int j = 0; j < rows1; j++) 
     { 
      for (int i = 0; i < rows0; i++) 
      { 
       var test = arr[i, j]; 
       arrFlattened[i + j * rows0] = arr[i, j]; 
      } 
     } 
     return arrFlattened; 
    } 
    public static T[,] Expand<T>(T[] arr, int rows0) 
    { 
     int length = arr.GetLength(0); 
     int rows1 = length/rows0; 
     T[,] arrExpanded = new T[rows0, rows1]; 
     for (int j = 0; j < rows1; j++) 
     { 
      for (int i = 0; i < rows0; i++) 
      { 
       arrExpanded[i, j] = arr[i + j * rows0]; 
      } 
     } 
     return arrExpanded; 
    }