У меня есть объект InputFile
, который имеет массивы и объекты для хранения содержимого файла. У меня также есть ABCFile
и XYZFile
, которые унаследованы от InputFile
, которые будут читать разные типы файлов и хранить их в проецируемых элементах InputFile
.XML Deserialization of Inherited Objects
Поскольку сериализация и десериализация обоих этих объектов идентичны родительскому объекту, я реализовал стандартный интерфейс сериализации XML на родительском объекте. Во время десериализации считывается несколько параметров, вызывается функция Read
(для загрузки файла), затем завершается десериализация.
сериализации отлично работает, но десериализации (из List<InputFile>
) не работает, потому что десериализатор называет родители окурок Read
файл функции вместо ABCFile
или XYZFile
«с.
Как я могу получить десериализацию, чтобы распознать правильный тип объекта для использования? Возможно, что у моего List<InputFile>
будет множество типов файлов.
Благодаря
код я использую для сериализации объекта:
public class InputFileHolder : IXmlSerializable {
...
public void WriteXml(XmlWriter w) {
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer ifXml = new XmlSerializer(typeof(List<InputFile>));
ifXml.Serialize(w, InputFiles, ns);
//More serialization
}
Любые идеи, как сохранить тип объекта, когда я пользовательских сериализации список?
Благодарим за быстрый ответ. Созданный XML по-прежнему выглядит так: ArrayOfInputFile>. Если я вручную отредактировал XML, чтобы изменить InputFile на ABCFile, он не работает с ошибкой XML. –
Aaron
Взгляните на мой фрагмент кода и скажите, что произойдет –
Хорошо, думаю, я обнаружил корень проблемы. Моя версия InputFileHolder имеет интерфейс IXmlSerializable, где у меня есть пользовательское чтение/запись параметров для сериализации.Если я удалю интерфейс IXmlSerializable и дам инфраструктуре обработать его, я получаю XML как ваш, где указан тип объекта. Мне нужно иметь пользовательское чтение, поэтому мне нужно исправить запись. Я напишу свой код в главном сообщении. – Aaron