在c#中序列化数组

本文关键字:数组 序列化 | 更新日期: 2023-09-27 18:11:30

在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));

说:"有一个错误反映类型'Data' "

我对Stack和Xml/Xml序列化都是新手,所以任何帮助都会很感激。

在c#中序列化数组

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不使用

不能序列化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]; 
}

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

如果你不关心数据看起来像什么,那么你可以使用二进制格式化器序列化对象,它可以序列化任何标记为可序列化的东西,然后将二进制数据持久化为base64编码的字符串。

包装器实现如下:

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