由於我沒有找到更好的方式來處理我的配置,我一直使用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
只是一個擁有更簡單的正則表達式語法的類,它提供了與普通正則表達式(匹配,替換等)相同類型的方法。這樣,普通人就可以使用它。這RegexCollection
(List<SimpleRegex>
)是不原始的。這是我的問題。基本上,我想要做的就是保存並加載任何數據類型。
保存和*任意*加載數據類型根本不可能 - *所有*序列化程序在數據上放置一些條件。 @Jalal給出了使用'BinaryFormatter'的一個合理的描述,它有一個優勢,它可以讓你使用'object'(因爲'BinaryFormatter'將完整的類型細節寫入流中),但是*個人*我會簡單地說:不要在這裏使用'object':知道你的數據是什麼。 – 2010-07-09 05:40:17
如果我只是把它作爲一個變量'XmlSerializer(typeof(Config))'自動計算出如何序列化RegexCollection?那麼...... XmlSerializer是否在序列化中遞歸呢? GAR你明白我的意思嗎? – Buttink 2010-07-09 05:59:45
只要你的'Config'類型(通過屬性等)明確它需要'RegexCollection',並且只要'RegexCollection'是一個容易理解的列表,並且只要'SimpleRegex'具有可變屬性,並且所有類型都是公共的,都有公共構造函數....然後是的。當然還有其他序列化器需求較少。 – 2010-07-09 06:20:51