Xml反序列化器反序列化任何数据类型

时间:2010-07-09 04:08:31

标签: c# .net xml-serialization

因为我还没有找到更好的方法来处理我的配置,所以我一直在使用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只是一个包含更简单的正则表达式语法的类,并提供了普通正则表达式(匹配,替换等)的相同方法。这样,普通人就可以使用它。这个RegexCollectionList<SimpleRegex>)不是原始的。那是我的问题。基本上,我想要做的就是保存并加载任何数据类型。

1 个答案:

答案 0 :(得分:2)

使用XML序列化有一些条件:

  • 无法序列化多维数组
  • 要序列化的类应该有一个没有任何参数的构造函数。

任何数据类型都不会使用XML Serializer进行序列化...

使用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;
    }