2013-04-30 75 views
2

有没有办法将序列在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));

说:“曾经有反射式‘数据’错误”

我特别新堆栈和XML/XML序列化所以任何帮助,将不胜感激。

+0

'数据'可能不是唯一的,因为它可能在多个使用的名称空间中定义。请在代码中显示'using'语句。 – joe 2013-04-30 21:03:45

+0

我的代码在我的程序中是exaclty。将数组更改为单个字符串并将其缩短可以正常工作,并将数据写入文件 - *编辑*误读,将加入。 – Ewan 2013-04-30 21:06:31

+0

xmlserializer不支持多维数组。 – I4V 2013-04-30 21:07:01

回答

4

XmlSerialzier不支持多维数组。无需Serializable属性:但是你可以通过使用一个临时类像这样

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做一个解决办法。它不被XmlSerialzier使用

3

你不能序列化一个int [,],但你可以序列化一个int [] []。序列化的二维阵列之前,只需将它转换成锯齿状排列那样:

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