C# 类未按预期序列化

C# 类未按预期序列化,c#,serialization,C#,Serialization,我一整天都在为这件事挣扎。我做了很多研究,但我似乎不能把它们全部放在一起 我有一个来自服务器的XML响应,如下所示: <?xml version="1.0" ?> <inboxRecords> <inboxRecord> <field1 /> <field2 /> <field3 /> </inboxRecord> <inboxReco

我一整天都在为这件事挣扎。我做了很多研究,但我似乎不能把它们全部放在一起

我有一个来自服务器的XML响应,如下所示:

<?xml version="1.0" ?>
<inboxRecords>
    <inboxRecord>
        <field1 />
        <field2 />
        <field3 />
    </inboxRecord>
    <inboxRecord>
        <field1 />
        <field2 />
        <field3 />
    </inboxRecord>
</inboxRecords>
上面的课程是基于我在网上找到的众多例子中的一个。问题是,当我序列化上面的类(以确认其正确性)时,结果如下:

<?xml version="1.0" encoding="utf-16"?>
<inboxRecords>
  <InboxRecords>
    <InboxRecord>
      <field1>some value</field1>
    </InboxRecord>
    <InboxRecord>
      <field1>some value</field1>
    </InboxRecord>
  </InboxRecords>
</inboxRecords>
[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元素?我只想让词根这么说(用一个小的“I”)。其次,为了快速测试,我只在第一个字段中输入一个值。为什么其他字段没有显示为空元素?我需要另一个装饰师吗

谢谢!
谢谢

使用
xmlement
属性:

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

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

使用
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; }
    }
}

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

未经测试,但我认为您可能可以这样做:

<?xml version="1.0" encoding="utf-16"?>
<inboxRecords>
  <InboxRecords>
    <InboxRecord>
      <field1>some value</field1>
    </InboxRecord>
    <InboxRecord>
      <field1>some value</field1>
    </InboxRecord>
  </InboxRecords>
</inboxRecords>
[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; }
    }
}
[XmlRoot(“收件箱记录”)]
公共密封类QueueQueryResult:集合
{
公共队列查询结果()
{
InboxRecords=null;
}
公开密封类收件箱记录
{
公共字符串字段1{get;set;}
公共字符串字段2{get;set;}
公共字符串字段3{get;set;}
}
}

代码的问题是,在序列化到
InboxRecords
的对象中有一个成员
InboxRecords
。通过使类继承自
集合
,您为它提供了处理一组
InboxRecords
的能力,而无需额外的内部元素。

未经测试,但我认为您可能可以这样做:

<?xml version="1.0" encoding="utf-16"?>
<inboxRecords>
  <InboxRecords>
    <InboxRecord>
      <field1>some value</field1>
    </InboxRecord>
    <InboxRecord>
      <field1>some value</field1>
    </InboxRecord>
  </InboxRecords>
</inboxRecords>
[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; }
    }
}
[XmlRoot(“收件箱记录”)]
公共密封类QueueQueryResult:集合
{
公共队列查询结果()
{
InboxRecords=null;
}
公开密封类收件箱记录
{
公共字符串字段1{get;set;}
公共字符串字段2{get;set;}
公共字符串字段3{get;set;}
}
}

代码的问题是,在序列化到
InboxRecords
的对象中有一个成员
InboxRecords
。通过使类继承自
集合
,您为它提供了处理一组
InboxRecords
的能力,而无需额外的内部元素。

使用
XSD.exe从第一个示例XML(然后是a.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名称空间之外,这看起来与第一个示例非常相似。

使用
XSD.exe从第一个示例XML(然后是a.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名称空间之外,这看起来与第一个示例非常相似。

您的嵌套类称为InboxRecord。。。这就是序列化程序将使用的。您是否尝试过使用
xsd.exe
为您生成类?是的,它生成的类似乎与我已有的类没有太大的不同。我还没有将该类添加到我的项目中,但我会尝试一下。您的嵌套类称为InboxRecord。。。这就是序列化程序将使用的。您是否尝试过使用
xsd.exe
为您生成类?是的,它生成的类似乎与我已有的类没有太大的不同。我还没有将该类添加到我的项目中,但我会尝试一下。成功了!谢谢我知道我很接近,就是这样!谢谢我知道我离你很近。实际上我也是按你的方式做的,而且效果很好。谢谢事实上,我也是按你的方式做的,而且效果很好。谢谢