2010-11-23 14 views
3

Gegeben eine (erfundene) Basisklasse und eine Subklasse, die wir via WCF mit dem XmlSerializer serialisieren wollen. Wir dekorieren eine Sammlung (die Antwort-Klasse) gemäß dem Artikel:XmlSerializer + Polymorphism

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.aspx (siehe Bemerkungen Abschnitt).

Problem ist, dass, obwohl die korrekte WSDL erzeugt zu werden scheint, SvcUtil eine Klassendatei erzeugt, wo die GetUserResponse Klasse eine Eigenschaft namens Elemente enthält. Hat das mit der Anwendung von [XmlElement] auf ein Array zu tun? Das XmlArray-Element verfügt zwar nicht über eine Type-Eigenschaft.

Vielen Dank im Voraus.

[Serializable] 
[XmlType] 
public class UserBase 
{ 
    public int Id {get;set;} 
} 

[Serializable] 
[XmlType] 
public class BasicUser : UserBase 
{ 
    public string UserName {get;set;} 
} 

[Serializable] 
[XmlType] 
public class SuperUser : UserBase 
{ 
    public string UserName {get;set;} 
    public bool SpecialLevel {get;set;} 

} 

[Serializable] 
[XmlType] 
public class GetUserResponse 
{ 
    [XmlElement("Users", typeof(User)), XmlElement("SuperUsers", typeof(SuperUser))] 
    public List<UserBase> Users {get;set;} 
} 
+0

Warum benötigen Sie den XmlSerializer? Warum nicht einfach den Data Contract Serializer verwenden, der schneller und flexibler ist? –

+0

btw, '[Serializable]' fügt hier nichts hinzu, es sei denn, Sie verwenden auch 'BinaryFormatter' irgendwo. –

+0

@John - Danke Kumpel - wir haben nur 100000000 Stunden unnötige Verschlimmerung vom XmlSerializer erlebt. Es wird nicht von der Wahl verwendet. Es gibt Interop-Bedenken (d. H. DataContractSerializer ist tatsächlich * weniger * flexibel an den Stellen, die wir brauchen). – 6footunder

Antwort

7

Weil Sie [XmlElement] auf der Sammlungseigenschaft verwenden, die entsprechende xml sein wird, so etwas wie:

<GetUserResponse> 
    <Users>{this is a user}</Users> 
    <Users>{this is a user}</Users> 
    <SuperUsers>{this is a super user}</SuperUsers> 
    <Users>{this is a user}</Users> 
    <SuperUsers>{this is a super user}</SuperUsers> 
</GetUserResponse> 

es nicht wirklich überall ist, kann es einen besseren Namen für eine Sammlung erhalten Immobilien, andere als Items. Ich frage mich, ob es könnte besser sein, zu verwenden:

[XmlArray("Users")] 
[XmlArrayItem("User", typeof(User))] 
[XmlArrayItem("SuperUser", typeof(SuperUser))] 

, um zu bauen:

<GetUserResponse> 
    <Users> 
     <User>{this is a user}</User> 
     <User>{this is a user}</User> 
     <SuperUser>{this is a super user}</SuperUser> 
     <User>{this is a user}</User> 
     <SuperUser>{this is a super user}</SuperUser> 
    </Users> 
</GetUserResponse> 

dann würden Sie eine Users Eigenschaft.

+0

OMG. Warum habe ich nicht gesehen, dass der XmlArray ctor eine Art Override hatte? Ich werde das schnell testen und dann diese Antwort markieren. Danke Marc. – 6footunder