2010-11-23 4 views
3

Учитывая (надуманный) базовый класс и подкласс, который мы хотим сериализовать через WCF с помощью XmlSerializer. Мы украшаем коллекцию (см. Класс ответа) согласно статье:XmlSerializer + Polymorphism

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.aspx (см. Раздел замечаний).

Проблема заключается в том, что, хотя кажется, что создается правильный WSDL, SVCUtil создает файл класса, в котором класс GetUserResponse содержит свойство с именем Items. Это связано с применением [XmlElement] к массиву? Хотя элемент XmlArray не имеет свойства Type.

Заранее спасибо.

[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

Зачем вам нужен XmlSerializer? Почему бы просто не использовать Serializer Data Contract Serializer, который быстрее и гибче? – 2010-11-23 20:12:56

+0

btw, `[Serializable]` ничего здесь не добавляет, если вы также не используете `BinaryFormatter`. – 2010-11-23 20:15:34

ответ

7

Поскольку вы используете [XmlElement] на свойства коллекции, соответствующий XML будет что-то вроде:

<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> 

есть на самом деле не везде, где можно получить лучшее имя для коллекции Недвижимость, кроме Items. Интересно, если это может быть лучше использовать:

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

для того, чтобы построить:

<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> 

, то вы бы Users собственность.

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

  • Нет связанных вопросов^_^