2010-07-09 56 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