类没有按预期序列化

时间:2013-01-30 22:15:48

标签: c# serialization

我整天都在苦苦挣扎。我做了很多研究,但我似乎无法将它们放在一起。

我有来自服务器的XML响应:

<?xml version="1.0" ?>
<inboxRecords>
    <inboxRecord>
        <field1 />
        <field2 />
        <field3 />
    </inboxRecord>
    <inboxRecord>
        <field1 />
        <field2 />
        <field3 />
    </inboxRecord>
</inboxRecords>

我创建了以下代码来表示响应。目的是我将使用以下内容对反应进行反序列化:

[XmlRoot("inboxRecords")]
public sealed class QueueQueryResult
{
    public InboxRecord[] InboxRecords;

    public QueueQueryResult()
    {
        InboxRecords = null;
    }

    public sealed class InboxRecord
    {
        public string field1 { get; set; }
        public string field2 { get; set; }
        public string field3 { get; set; }
    }
}

上述课程基于我在网上找到的众多例子之一。问题是,当我序列化上面的类(以确认它是正确的)时,它出现如下:

<?xml version="1.0" encoding="utf-16"?>
<inboxRecords>
  <InboxRecords>
    <InboxRecord>
      <field1>some value</field1>
    </InboxRecord>
    <InboxRecord>
      <field1>some value</field1>
    </InboxRecord>
  </InboxRecords>
</inboxRecords>

所以,第一个问题,如何摆脱额外的InboxRecords元素?我只想让根说(用小'我')。其次,为了快速测试,我只将值放在第一个字段中。为什么其他领域不是空元素?我需要另一个装饰器吗?

谢谢! 谢谢!

3 个答案:

答案 0 :(得分:3)

使用XmlElement属性:

[XmlRoot("inboxRecords")]
public sealed class QueueQueryResult
{
    [XmlElement("inboxRecord")]
    public InboxRecord[] InboxRecords;

    public QueueQueryResult()
    {
        InboxRecords = null;
    }

    public sealed class InboxRecord
    {
        public string field1 { get; set; }
        public string field2 { get; set; }
        public string field3 { get; set; }
    }
}

这将删除Array包装器元素,并允许您控制每个xml元素的名称,以便您可以使用小写名称。

答案 1 :(得分:1)

未经测试,但我认为你可能会做这样的事情:

[XmlRoot("inboxRecords")]
public sealed class QueueQueryResult : Collection<QueueQueryResult.InboxRecord>
{
    public QueueQueryResult()
    {
        InboxRecords = null;
    }

    public sealed class InboxRecord
    {
        public string field1 { get; set; }
        public string field2 { get; set; }
        public string field3 { get; set; }
    }
}

您的代码存在的问题是,您在序列化为InboxRecords的对象中有一个成员inboxRecords。通过使类继承自Collection,您可以为其提供处理一组InboxRecords而无需额外内部元素的功能。

答案 2 :(得分:0)

使用xsd.exe从第一个样本XML(然后是.cs)生成XSD后,我可以从第二个示例中创建并序列化一个实例:

<?xml version="1.0" encoding="utf-16"?>
<inboxRecords xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <inboxRecord>
    <field1>some value</field1>
  </inboxRecord>
  <inboxRecord>
    <field1>some value</field1>
  </inboxRecord>
</inboxRecords>

除了encoding属性和schema命名空间之外,这看起来非常类似于第一个示例。