Как сериализировать производный класс как его базовый класс

Удивительно, сколько людей не понимает, что это объектно-ориентировано также.

6
задан Michael Petrotta 1 December 2009 в 05:09
поделиться

3 ответа

Вам нужно будет передать GetType (DerivedClass) конструктору сериализатора, он должен соответствовать типу сериализуемого объекта. Вы можете использовать атрибут для переименования в корневой элемент. Этот пример кода работал так, как задумано:

using System;
using System.Xml.Serialization;
using System.IO;

class Program {
  static void Main(string[] args) {
    var obj = new DerivedClass();
    obj.Prop = 42;
    var xs = new XmlSerializer(typeof(DerivedClass));
    var sw = new StringWriter();
    xs.Serialize(sw, obj);
    Console.WriteLine(sw.ToString());

    var sr = new StringReader(sw.ToString());
    var obj2 = (BaseClass)xs.Deserialize(sr);
    Console.ReadLine();
  }
}

public class BaseClass {
  public int Prop { get; set; }
}
[XmlRoot("BaseClass")]
public class DerivedClass : BaseClass { }
4
ответ дан 17 December 2019 в 04:48
поделиться

Я не пробовал, но можете ли вы просто его не преобразовать?

serializer(stream, (BaseClass)derived);

Edit

Кроме того, если вы хотите иметь один XmlSerialiser, который может работать с несколькими производными классами и базовый класс, то вам нужно указать все типы в конструкторе XmlSerialiser.

  XmlSerializer serializer = new XmlSerializer(typeof(BaseClass), new Type[] {typeof(DerivedClass)});

Затем он успешно сериализует несколько типов. Однако вам также придется использовать упомянутое выше решение, чтобы выходной xml совпадал между классами.

0
ответ дан 17 December 2019 в 04:48
поделиться

После небольшого поиска в Google;) я могу сказать, что вам понадобится еще немного кода и реализовать IXmlSerializable для вашего базового класса, объявив все методы интерфейса как виртуальные и переопределив их в производном классе. Вот пример темы и аналогичной проблемы , решенной упомянутым интерфейсом.

0
ответ дан 17 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: