Вы не можете прочитать эту полезную нагрузку XML с помощью сериализатора DataContract.
Во-первых, переключите службу WCF на использование XmlSerializer :
[ServiceContract]
[XmlSerializerFormat]
public class WcfService
{
[OperationContract]
public void TheOperation(Carro carro)
{
// do what you need to do
}
}
Теперь используйте Datacontract, который использует атрибуты Xml для управления его сериализацией :
[XmlRoot(ElementName="Carro", Namespace="wcf")]
public class Carro
{
[XmlElement]
public Fabricante Fabricante { get; set; }
[XmlElement]
public List<Acessorio> Acessorio { get; set; }
}
Чтобы проверить, работает ли этот класс, я использовал следующий тестовый стенд в LinqPad:
var xml=@"<wcf:Carro xmlns:wcf=""wcf"">
<wcf:Fabricante>
<wcf:Id>0001</wcf:Id>
</wcf:Fabricante>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
</wcf:Carro>";
var obj = new Carro {
Fabricante = new Fabricante { Id ="0001"},
Acessorio = new List<Acessorio> {
new Acessorio{ Descrição = "1"},
new Acessorio{ Descrição = "2"} }
};
var xs = new XmlSerializer(typeof(Carro));
using(var ms = new MemoryStream())
{
using(var xw = XmlWriter.Create(ms, new XmlWriterSettings {Indent = true, OmitXmlDeclaration = true}))
xs.Serialize(xw, obj);
Encoding.UTF8.GetString(ms.ToArray()).Dump("serialized result");
var o = (Carro) xs.Deserialize(XmlReader.Create(new StringReader(xml)));
o.Dump("deserialized result");
}
Где результат результата сериализации:
<Carro xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="wcf">
<Fabricante>
<Id>0001</Id>
</Fabricante>
<Acessorio>
<Descrição>1</Descrição>
</Acessorio>
<Acessorio>
<Descrição>2</Descrição>
</Acessorio>
</Carro>
, что соответствует нашему ожидаемому вводу.