我正在尝试通过XmlSerializer为我正在研究的XNA项目序列化一个多维的整数数组时遇到问题。我可以毫不费力地序列化我的所有其他数据(布尔值,字符串,甚至颜色等)。我也看到很多人声称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.Xml.dll中发生了'System.InvalidOperationException'类型的未处理异常。生成XML文档时出错。”
我也尝试将这个数组用作结构中的成员变量(我存储了所有其他玩家数据),但是当我按照这种方式做事时我得到了同样的异常,这让我相信这不是一个简单的语法错误或类似的东西。
我是否需要重新构建我的代码以通过单维数组进行序列化,或者我有什么东西可以忽略?
提前致谢!
答案 0 :(得分:12)
阅读内部例外:
所以不是:不支持多维数组。您可能需要将其作为单维数组进行填充...您可以通过使用单独的属性来执行此操作:
[XmlIgnore]
public int[, ,] Data { get; set; }
[XmlElement("Data"), Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public int[] DataDto
{
get { /* flatten from Data */ }
set { /* expand into Data */ }
}
答案 1 :(得分:0)
我花了一些时间才弄清楚Marc的内容应该是什么,并设置括号来展平和扩展多维数组。
这是我的2D阵列解决方案。
就我而言,我在编译时知道其中一个维度是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;
}