【问题标题】:XmlSerialization of array of classes类数组的Xml序列化
【发布时间】:2011-08-29 14:51:41
【问题描述】:

我有一个定义如下的类(使用 xsd 生成):

[GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[SerializableAttribute]
[DebuggerStepThroughAttribute]
[DesignerCategoryAttribute("code")]
[XmlTypeAttribute(AnonymousType = true)]
[XmlRootAttribute(IsNullable = false)]
public class DataRequest
{
    private string _serviceField;
    private string _subscriptionField;

    public string Service
    {
        get
        {
            return _serviceField;
        }
        set
        {
            _serviceField = value;
        }
    }

    [XmlElement("Subscription"), DefaultValue(null)]
    public string Subscription
    {
        get
        {
            return _subscriptionField;
        }
        set
        {
            _subscriptionField = value;
        }
    }
}

然后,我定义了一个上述类的数组:

DataRequest[] requests = new DataRequest[2];
requests[0] = new DataRequest();
requests[1] = new DataRequest();
...

我想序列化这个数组并得到以下结果:

  <SOAP-ENV:Body>
    <DataRequest>
      <Service>ServiceA</DataService>
      <Subscription />
    </DataRequest>
    <DataRequest>
      <Service>ServiceB</DataService>
      <Subscription />
    </DataRequest>
  </SOAP-ENV:Body>

但是,当我调用以下命令时,输入是数组:

XmlSerializer serializer = new XmlSerializer(typeof(input));
serializer.Serialize(writer, input);

我得到以下信息:

  <Soap-ENV:Body>
    <ArrayOfDataRequest>
      <DataRequest>
        <Service>ServiceA</DataService>
        <Subscription />
      </DataRequest>
      <DataRequest>
        <Service>ServiceB</DataService>
        <Subscription />
      </DataRequest>
    </ArrayOfDataRequest>
  </Soap-ENV:Body>

有什么方法可以摆脱 ArrayOfDataRequest 元素,而直接序列化实际的数组元素?

【问题讨论】:

  • 嘿,Ben,我刚试了一下,得到了同样的结果 (ArrayOfDataRequest)。
  • 我对使用 xsd.exe 工具生成的复杂类做同样的事情。我发现序列化时最好的选择是使用 List,然后使用 List.ToArray();命令将列表转换为数组。这避免了必须指定要序列化的数组的大小。您还可以使用XmlWriterSettings XmlSettings = new XmlWriterSettings(); 然后XmlSettings. 指定选项。

标签: c# .net xml xml-serialization


【解决方案1】:

如果我错了,请纠正我,但我认为这是完全正确的关于 SOAP 特定序列化的问题。 body 标记的直接子元素是参数的元素,在本例中是 DataRequest 对象的数组。当序列化程序省略 ArrayOf... 标记时,SOAP 消息将改为包含两个 DataRequest 类型的参数。

也许您可以指定为什么需要这样一个“损坏”的消息来为您的实际问题找到解决方案?

【讨论】:

  • 嘿eFloh。我与之交互的服务允许这样一个损坏的 SOAP 请求,其中没有一个单一的核心根元素。我希望有某种方法可以修改我发送的请求以允许相同但看起来我需要更改服务以处理有效的 xml。
  • 在使用WCF的时候可以使用自定义的MessageFormatter来实现这个功能,asp.net网络引用分类也可能有这样的东西。
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
相关资源
最近更新 更多