关于基类和继承的类的XML序列化信息

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

我正在尝试将C#对象序列化为XML,以便可以将其用作API调用的主体。他们对需要的输入非常重视。我建立了下面的类来保存我需要发送给他们的数据。包括属性和所有属性作为元素而不是属性。他们还要求列表包含type="array",尽管创建我自己的类并实现列表将是最简单的,因为我给他们的所有列表都必须具有相同的属性。进行序列化时,它将序列化List项的基类,但不包括我想要的派生类的属性。

public class CustomArray<T> : List<T>
{
    [XmlAttribute]
    public string type { get; set; } = "array";
}

[XmlRoot("message")]
public class MessageBody
{
    [XmlArray("Checks"), XmlArrayItem("CheckItem")]
    public CustomArray<Check> CheckList { get; set; }
}

public class Check
{
    [XmlElement("C_CHECK_NUMBER")]
    public string CheckNumber { get; set; }

    [XmlElement("C_CHECK_AMOUNT")]
    public decimal Amount { get; set; }
}

然后运行此代码:

// Create a sample object
var message = new MessageBody()
{
    CheckList = new CustomArray<Check>
    {
        new Check
        {
            CheckNumber = "111",
            Amount = 1.00M
        },
        new Check
        {
            CheckNumber = "112",
            Amount = 2.00M
        }
    }
};

// Create custom settings
var settings = new XmlWriterSettings
{
    OmitXmlDeclaration = true,
    Indent = true
};

// Serialize item and print it to console
using (var sw = new StringWriter())
using (var writer = XmlWriter.Create(sw, settings))
{
    var serializer = new XmlSerializer(message.GetType());
    serializer.Serialize(writer, message, new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty }));
    Console.WriteLine(sw.ToString());
}

我将其写到控制台:

<message>
  <Checks>
    <CheckItem>
      <C_CHECK_NUMBER>111</C_CHECK_NUMBER>
      <C_CHECK_AMOUNT>1.00</C_CHECK_AMOUNT>
    </CheckItem>
    <CheckItem>
      <C_CHECK_NUMBER>112</C_CHECK_NUMBER>
      <C_CHECK_AMOUNT>2.00</C_CHECK_AMOUNT>
    </CheckItem>
  </Checks>
</message>

但是我需要得到这个:

<message>
  <Checks type="array">
    <CheckItem>
      <C_CHECK_NUMBER>111</C_CHECK_NUMBER>
      <C_CHECK_AMOUNT>1.00</C_CHECK_AMOUNT>
    </CheckItem>
    <CheckItem>
      <C_CHECK_NUMBER>112</C_CHECK_NUMBER>
      <C_CHECK_AMOUNT>2.00</C_CHECK_AMOUNT>
    </CheckItem>
  </Checks>
</message>

谢谢您的帮助!

c# xml serialization xml-serialization xmlserializer
1个回答
0
投票

尝试以下内容:

[XmlRoot("message")]
public class MessageBody
{
    [XmlElement("Checks")]
    public Checks Checks { get; set; }
}
public class Checks
{
    [XmlAttribute]
    public string type { get; set; }

    [XmlElement("Checks")]
    public List<Check> Checks { get; set; }
}

public class Check
{
    [XmlElement("C_CHECK_NUMBER")]
    public string CheckNumber { get; set; }

    [XmlElement("C_CHECK_AMOUNT")]
    public decimal Amount { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.