无法解析WCF中的列表

问题描述 投票:1回答:1

我无法在WCF端点中接收列表。

这是我的XML文件。我无法编辑这个结构

<wcf:Carro>
   <wcf:Fabricante>
      <wcf:Fabricante>
         <wcf:Id>
            <wcf:Id>0001</wcf:Id>
         </wcf:Gid>
      </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>

这是我的班级:

using System.Collections.Generic;
using System.Runtime.Serialization;
namespace WCFService
{
    [DataContract(Namespace = "http://mywcfservice.com/webservice")]
    public class Carro
    {
        [DataMember(Order = 1)]
        public Marca Marca { get; set; }

        [DataMember(Order = 2)]
        public Acessorio[] Acessorio { get; set; }
    }
}

关于Fabricante的信息我收到了,但“Acessorio”列表中没有。

我究竟做错了什么 ?

编辑:我做了一些调整。

注意:如果我包含一个新节点wcf:Acessorio并且在这个节点内我放了其他wcf:Acessorio然后工作。但我无法改变XML结构。

xml wcf
1个回答
1
投票

您无法使用DataContract序列化程序读取该XML有效内容。

首先,切换您的WCF服务以使用XmlSerializer

[ServiceContract]
[XmlSerializerFormat]
public class WcfService
{
    [OperationContract]
    public void TheOperation(Carro carro)
    {
        // do what you need to do
    }
}

现在使用一个使用XmlAttributes控制其serialization的datacontract:

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

这符合我们的预期输入。

© www.soinside.com 2019 - 2024. All rights reserved.