因为我还没有找到更好的方法来处理我的配置,所以我一直在使用XmlSerializer来序列化包含我想要保存的所有内容的Dictionary(稍后解释)。现在我变得更加狡猾,我已经开始构建更复杂的数据类型。唯一的问题是,现在当我序列化对象时,它会抛出一个错误,因为它不是原始数据类型。如果我为每个值创建一个新的序列化程序,那么我就无法加载该对象。有一个简单的方法吗?或者是一个用于保存和加载任何数据类型的简单库。
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>
)不是原始的。那是我的问题。基本上,我想要做的就是保存并加载任何数据类型。
答案 0 :(得分:2)
使用XML序列化有一些条件:
任何数据类型都不会使用XML 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;
}