有没有办法在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序列化都特别陌生,所以任何帮助都会受到赞赏。
答案 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();
}
}