Используйте производный тип и атрибут XmlInclude
. Например:
public class Book
{
public string Title;
public string Author;
}
public class MyBookType : Book { }
[XmlInclude(typeof(MyBookType))]
[XmlRoot("Books")]
public class Books : List<Book> { }
public void Run()
{
var b = new Books();
b.Add(new MyBookType
{
Title = "The Art of War",
Author = "Sun Tzu"
});
b.Add(new MyBookType
{
Title = "Great Expectations",
Author = "Charles Dickens"
});
var s = new XmlSerializer(typeof(Books));
s.Serialize(Console.Out, b);
}
Выполнение этого приводит к выводу:
<?xml version="1.0" encoding="IBM437"?>
<Books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Book xsi:type="MyBookType">
<Title>The Art of War</Title>
<Author>Sun Tzu</Author>
</Book>
<Book xsi:type="MyBookType">
<Title>Great Expectations</Title>
<Author>Charles Dickens</Author>
</Book>
</Books>
Поскольку вы используете запрос SOAP, я предполагаю, что ASMX означает, что сериализация происходит неявно. Вам нужно будет применить [XmlInclude]
к тому, что содержит коллекцию книг. Это может быть параметр в веб-методе, например.
Вы можете автоматически генерировать соответствующий атрибут XmlInclude, начиная с XSD и WSDL, если вы определяете типы в XSD с отношением наследования, которое я иллюстрировал в коде C #.
В WSDL сообщение запроса может иметь тип Books
, который является набором Book
. Отдельно определите MyBookType
, который происходит от Book, но не расширяет его.