2010-07-09 25 views
2

由於我沒有找到更好的方式來處理我的配置,我一直使用XmlSerializer來序列化一個包含所有我想保存的東西的字典(稍後解釋)。現在我變得更加狡猾了,我開始構建更復雜的數據類型。唯一的問題是,現在當我序列化對象時,它會拋出一個錯誤,因爲它不是原始數據類型。如果我爲每個值創建一個新的序列化程序,則無法加載對象。有沒有簡單的方法呢?或者用於保存和加載任何數據類型的簡單庫。Xml解串器反序列化任何數據類型

The Serializable Dictionary。我使用<string,object><T,S>

public void ReadXml (System.Xml.XmlReader reader) 
{ 
try { 
    XmlSerializer deserializerKeys = new XmlSerializer(typeof(T)); 
    XmlSerializer deserializerValues = new XmlSerializer(typeof(S)); 
    reader.Read(); 
    while (true) { 
    T key = (T)deserializerKeys.Deserialize(reader); 
    S val = (S)deserializerValues.Deserialize(reader); // fail :(
    this.Add(key, val); 
    } 
} catch (Exception e) { 
    Console.WriteLine(e.Message); 
    Console.WriteLine(e.StackTrace); 
} 
} 


public void WriteXml (System.Xml.XmlWriter writer) 
{ 
    // ONE OF THE serializerValues is always commented out 
    // Im just showing the two ways I have done this 
XmlSerializer serializerKeys = new XmlSerializer(typeof(T)); 
    // this works for loading but not for saving >.> 
XmlSerializer serializerValues = new XmlSerializer(typeof(S)); 
foreach (KeyValuePair<T,S> pair in this) { 
     // this way works with the saving but fails with loading 
    XmlSerializer serializerValues = new XmlSerializer(pair.Value.GetType()); 
    serializerKeys.Serialize(writer, pair.Key); 
    serializerValues.Serialize(writer, pair.Value); 
} 
} 

然後我就被從List<SimpleRegex>派生另一個類,它擁有所有的SimpleRegex對象和「選擇正則表達式」。 SimpleRegex只是一個擁有更簡單的正則表達式語法的類,它提供了與普通正則表達式(匹配,替換等)相同類型的方法。這樣,普通人就可以使用它。這RegexCollectionList<SimpleRegex>)是不原始的。這是我的問題。基本上,我想要做的就是保存並加載任何數據類型。

+0

保存和*任意*加載數據類型根本不可能 - *所有*序列化程序在數據上放置一些條件。 @Jalal給出了使用'BinaryFormatter'的一個合理的描述,它有一個優勢,它可以讓你使用'object'(因爲'BinaryFormatter'將完整的類型細節寫入流中),但是*個人*我會簡單地說:不要在這裏使用'object':知道你的數據是什麼。 – 2010-07-09 05:40:17

+0

如果我只是把它作爲一個變量'XmlSerializer(typeof(Config))'自動計算出如何序列化RegexCollection?那麼...... XmlSerializer是否在序列化中遞歸呢? GAR你明白我的意思嗎? – Buttink 2010-07-09 05:59:45

+0

只要你的'Config'類型(通過屬性等)明確它需要'RegexCollection',並且只要'RegexCollection'是一個容易理解的列表,並且只要'SimpleRegex'具有可變屬性,並且所有類型都是公共的,都有公共構造函數....然後是的。當然還有其他序列化器需求較少。 – 2010-07-09 06:20:51

回答

2

使用XML序列化有一定的條件:

  • 它不能序列多維數組
  • 這是要序列化應該不帶任何參數的構造方法的類。

任何數據類型將不會與XML序列進行序列化...

使用Binary Serializer

public void SerializeObject(string filename, Object o) 
{ 
    Stream stream = File.Open(filename, FileMode.Create); 
    BinaryFormatter bFormatter = new BinaryFormatter(); 
    bFormatter.Serialize(stream, o); 
    stream.Close(); 
} 

和二進制解串器

public object DeserializeObject(string filename) 
    { 
     object o; 
     Stream stream = File.Open(filename, FileMode.Open); 
     BinaryFormatter bFormatter = new BinaryFormatter(); 
     o = (ObjectToSerialize)bFormatter.Deserialize(stream); 
     stream.Close(); 
     return o; 
    } 
+0

好吧,XML序列化程序絕對可以序列化數組。 – 2010-07-09 05:05:02

+1

我知道我一直在談論它,但'BinaryFormatter'對於任何持久化的東西(例如磁盤(或db))來說都不是**的絕佳選擇。它唯一有利於它的地方是它可以與'object'一起使用。我在那裏會有「不要在這裏使用'對象 - 預先了解數據」。 'BinaryFormatter' *也有要求 - 例如你的類型是'ISerializable'或'[Serializable]'。 – 2010-07-09 05:36:21

+0

謝謝,但我的意思是多維數組! 以下異常上升多維數組雖然XML序列化: 「無法序列類型System.Int32 [,]多維數組不支持的對象」 但建議使用XML序列化保存配置... – Jalal 2010-07-11 06:13:51