2010-10-06 4 views
2

Я сериализация набора классов, который выглядит как:Изменения унаследованного имени класса в XML C#

public class Wrapper 
{ 
    IInterface obj; 
} 

public interface IInterface 
{ 
} 

[XmlType("ClassA")] 
public ImplA : IInterface 
{ 
} 

В настоящее время XML сгенерированного выглядит как

<Wrapper> 
    <IInterface xsi:type="ClassA"> 
... 
    </IInterface> 
</Wrapper> 

Есть в любом случае включать имя пользовательского типа как имя элемента, а не включать его в тип?

+1

Я подозреваю, что ответ заключается в том, чтобы написать собственный сериализатор. – Lazarus

ответ

1

Если вы хотите сделать это для этого дерева, вы можете поместить объявление XmlElementAttribute в вашем обертке:

public class Wrapper 
{ 
    [XmlElement(ElementName="ClassA")] 
    IInterface obj; 
} 
+0

Это будет использовать имя элемента ClassA для любой реализации IInterface. Я считаю, что OP ищет что-то, что будет использовать ClassA только как имя элемента для класса ImplA. –

+0

Правильно, для интерфейса будет многократная реализация. – codechobo

+0

@codechobo. Но хотите ли вы, чтобы каждая реализация имела одно и то же имя элемента, или каждая реализация имела другое имя элемента (это давало бы им все одинаковое имя элемента). –

1

Вы должны использовать XmlIncludeAttribute:

public class Wrapper 
{ 
    //XmlInclude should in this case at least include ImplA, but you propably want all other subclasses/implementations of IInterface 
    [XmlInclude(typeof(ImplA)), XmlInclude(typeof(ImplB))] 
    IInterface obj; 
} 

Это делает XML сериализатору известно из подтипов IInterface, которые свойство может иметь.

Смежные вопросы