Стратегия для XmlSerialisation с интерфейсом? - PullRequest
0 голосов
/ 16 марта 2009

У меня есть интерфейс, который в настоящий момент реализуют два класса. Данные для этих классов считываются из XML-файла.

, например

[Serializable]
public interface IMyInterface { }

[Serializable]
public class MyClass1 : IMyInterface { }

[Serializable]
public class MyClass2 : IMyInterface { }

Я хочу вывести тип из Xml, есть ли способ сделать это?

Так, например, мой XML выглядит так:

 <meta type="MyClass1">
   <!--- Some meta data -->
 </meta>  

Я хочу иметь возможность напрямую сериализовать из XML в объекты. В настоящее время я вручную обрабатываю xml.

Редактировать: Чтобы уточнить, я знаю, как сериализовать, но я не могу сериализовать обратно, не зная, какой это тип первым. Должен ли я прочитать атрибут типа, а затем сериализовать на основе этого?

Ответы [ 4 ]

1 голос
/ 16 марта 2009

Если я правильно понимаю ваш запрос ...

Имейте свойство в вашем интерфейсе, скажем

[Serializable]
public interface IMyInterface 
{ 
 YourClassDifferentiatorEnum ObjectDifferentiator { get;  set; }
}

И пусть каждый класс устанавливает это значение с различным значением перечисления. Сериализуйте эти конкретные классы в XML.

Если вы хотите десериализовать (XML обратно в конкретный объект), затем десериализовать его до IMyInterface, проверить наличие дифференциатора объекта и привести соответственно

1 голос
/ 16 марта 2009

Если вы используете XmlSerializer, вы можете добавить XmlIncludeAttribute , чтобы указать производные классы, которые можно десериализовать. Но дело в том, что вы должны добавить его в класс base :

[XmlInclude(typeof(DerivedClass))]
public abstract class BaseClass
{
    public abstract bool Property { get; set; }
}

public class DerivedClass : BaseClass
{
    public override bool Property { get; set; }
}

Другим способом было бы реализовать IXmlSerializable для члена, который может быть получен, а затем иметь Фабрику для производных классов на основе атрибута (или это то, что вы делаете сейчас?)

1 голос
/ 16 марта 2009

Сериализатор XML не предназначен для подобных ситуаций. Он предназначен для сериализации объектов, которые могут быть сопоставлены с XML, описанным схемой XML.

С другой стороны, сериализация во время выполнения включает в себя средство форматирования SOAP, которое может сериализовать объекты, включая подробности их типов .NET. Так может NetDataContractSerializer в WCF.

0 голосов
/ 16 марта 2009

Я не знаю, может ли это помочь, но вот оно ...

Что, если вы поместите открытое свойство в классы, которые возвращают имя типа

[XmlAttribute]
public string Type {
    get { return GetType().Name; }
}
...