在C#中序列化数组

时间:2013-04-30 21:01:27

标签: c# xml xml-serialization

有没有办法在C#中序列化整个数组,例如:

[Serializable()]
public class Data
{
    public short Some_Short_Data = new short[100,100];
    public string Some_String_Data = new string[100,100];
}

然后写文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


using System.Xml;
using System.Xml.Serialization;
using System.IO;

Data Write_Data = new Data();

XmlSerializer Writer = new XmlSerializer(typeof(Data));

    using (FileStream file = File.OpenWrite("Myfile.xml"))
    {
        Writer.Serialize(file, Write_Data); //Writes data to the file
    }

当我尝试这个时,它失败了:      XmlSerializer Writer = new XmlSerializer(typeof(Data));

说:“反映类型'数据'的错误”

我对Stack和Xml / Xml序列化都特别陌生,所以任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:4)

XmlSerialzier不支持多维数组。但是你可以使用像这样的临时类来解决这个问题

public class Array100<T>
{
    public T[] Data = new T[100];
}

public class Data
{
    public Array100<short>[] Some_Short_Data = new Array100<short>[100];
    public Array100<string>[] Some_String_Data = new Array100<string>[100];
}

BTW:不需要Serializable属性。它不被XmlSerialzier

使用

答案 1 :(得分:3)

你不能序列化int [,]但你可以序列化int [] []。在序列化2D数组之前,只需将其转换为如下的锯齿状数组:

var my2dArray = new int[2,5];
var myJaggedArray = new int [2][];

for(int i = 0 ; i < my2DArray.GetLength(0) ; i ++)
{
    myJaggedArray[i] = new int[my2DArray.GetLength(1)];

    for(int j = 0 ; j < my2DArray.GetLength(1) ; j ++)
        myJaggedArray[i][j] = my2DArray[i,j]; 
}

答案 2 :(得分:0)

我在尝试序列化多维数组时遇到了这个问题,该多维数组是对象字典中的一个值。我采用的方法是将所有数组包装在序列化之前可序列化的类中,然后将其全部解包。

如果您不关心数据的样子,那么您可以使用二进制格式化程序序列化对象,该格式化程序可以序列化标记为可序列化的任何内容,然后将二进制数据保存为基本的64位编码字符串。

包装器实现如下。

[Serializable]
public class UnserializableValueWrapper: IXmlSerializable
{
    private static readonly BinaryFormatter Formatter = new BinaryFormatter();

    public UnserializableValueWrapper([NotNull] object value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }

        this.Value = value;
    }

    public UnserializableValueWrapper()
    {
    }

    public object Value { get; private set; }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        reader.ReadStartElement();

        var length = int.Parse(reader.GetAttribute("length"));
        reader.ReadStartElement("Data");

        var buffer = new byte[length];
        reader.ReadContentAsBase64(buffer, 0, length);
        using (var stream = new MemoryStream(buffer))
        {
            this.Value = Formatter.Deserialize(stream);
        }

        reader.ReadEndElement();
        reader.ReadEndElement();
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteStartElement("Data");

        using (var stream = new MemoryStream())
        {
            Formatter.Serialize(stream, this.Value);
            var buffer = stream.ToArray();
            writer.WriteAttributeString("length", buffer.Length.ToString());
            writer.WriteBase64(buffer, 0, buffer.Length);
        }

        writer.WriteEndElement();
    }
}