Использование C # xmlserializer в производных классах при управлении сгенерированным элементом XML - PullRequest
2 голосов
/ 26 ноября 2010

У меня есть структура классов C # с абстрактным базовым классом и различными классами, производными от этого абстрактного класса.

[System.Xml.Serialization.XmlInclude(typeof(B))]
public abstract class A {
 ...
}

[Serializable]
[XmlType("typename")]
public class B : A  {
 ...
}

Кроме того, я использую экземпляр класса B в другом классе C в качестве поля с его абстрактным типом, подобным этому:

public class C {
    ...
    public A myItem { get; set; } //A is actually of type B
    ...
}

Теперь, когда я сериализую свой класс C через стандартный xmlserializer, я получаю XML-структуру, подобную этой:

<C>
    <myItem p2:type="typename" xmlns:p2="...">
     ... //Fields as elements and stuff
    </myItem>
</C>

Но это не то, что мне нужно, потому что я отправляю эти сериализованные объекты C в REST Webservice (у которого пока нет действующей схемы). На самом деле мне нужно что-то вроде этого:

<C>
    <typename>
     ... //Fields as elements and stuff
    </typename>
</C>

Но, как вы можете видеть выше, xmlserializer, похоже, предпочитает имя поля экземпляра, а не имя типа, установленное через XmlType. Кроме того, очевидно, что я не могу просто использовать XmlElement ("typename") для своего поля в C, потому что я не знаю, какую конкретную реализацию моего абстрактного класса A будет содержать поле.

Кто-нибудь когда-нибудь имел подобную проблему и мог бы дать мне решение этой проблемы? Или мне действительно нужно реализовать IXmlSerializable в моем классе A и, следовательно, во всех моих конкретных классах, производных от A, чтобы это работало?

РЕДАКТИРОВАТЬ: Только что при чтении некоторых статей обнаружил, что IXmlSerializable не позволяет мне контролировать элемент-обертку, поэтому мне действительно нужно реализовать Интерфейс в классе C с некоторым переключателем () тип члена myItem?

Спасибо за вашу помощь!

С наилучшими пожеланиями, Фло

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

Хорошо, похоже, я нашел решение, по крайней мере для сериализации, пока не знаю, работает ли это также для десериализации. Ключ является специальным конструктором для атрибута XMLElement, который позволяет указать ключ для использования, если используется абстрактный тип:

http://msdn.microsoft.com/en-us/library/cz6bdh5z.aspx

Может быть, это также полезно для кого-то еще.

Лучший, Фло

0 голосов
/ 26 ноября 2010

Для десериализации вам потребуется предоставить XmlSerializer все типы, с которыми он МОЖЕТ встретиться во всех свойствах абстрактного типа.

XmlSerializer имеет специальный конструктор, в котором вы можете передать ему коллекцию типов.

...