У меня есть структура классов 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?
Спасибо за вашу помощь!
С наилучшими пожеланиями,
Фло