2013-04-30 98 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(); 
    } 
}