由于我没有找到更好的方式来处理我的配置,我一直使用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