Xml Deserializer для десериализации любого типа данных - PullRequest
2 голосов
/ 09 июля 2010

Поскольку я не нашел лучшего способа обработки своей конфигурации, я использовал XmlSerializer для сериализации словаря (объясним позже), содержащего все, что я хочу сохранить.Теперь, когда я стал хитрее, я начал создавать более сложные типы данных.Единственная проблема заключается в том, что теперь, когда я сериализую объект, он выдает ошибку, потому что это не примитивный тип данных.Если я создаю новый сериализатор для каждого значения, я не могу загрузить объект обратно.Есть ли простой способ обойти это?Или простая библиотека для сохранения и загрузки любого типа данных.

Сериализуемый словарь.Я использую <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>) не примитивно.Это моя проблема.По сути, все, что я хочу сделать, это сохранить и загрузить любой тип данных.

1 Ответ

2 голосов
/ 09 июля 2010

Использование 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;
    }
...