【问题标题】:Serializing an array of integers using XmlSerializer使用 XmlSerializer 序列化整数数组
【发布时间】:2009-02-16 16:10:51
【问题描述】:

我在尝试通过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 文档时出错。

我也尝试过将此数组用作结构中的成员变量(我的所有其他玩家数据都存储在其中),但是在这样做时我也遇到了同样的异常,这让我相信这不是一个简单的语法错误或类似的东西。

我是否需要重组我的代码以通过一维数组进行序列化,还是我忽略了什么?

提前致谢!

【问题讨论】:

    标签: c# .net serialization xna


    【解决方案1】:

    阅读内部异常:

    • 反映类型“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 */ }
    } 
    

    【讨论】:

    • 这就是我所期待的答案。谢谢!
    【解决方案2】:

    我花了一段时间才弄清楚应该在 Marc 的 get 和 set 大括号中加入什么来展平和扩展多维数组。

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

    就我而言,我在编译时知道其中一个维度是 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多