XmlSerializer 正在删除元素

本文关键字:元素 删除 XmlSerializer | 更新日期: 2023-09-27 18:31:51

我有一个程序,它将XML流反序列化为对象,进行一些小的更改,然后序列化为XML。 但这里的问题是生成的序列化 XML 缺少元素。

这是一个最小的程序,显示了我正在经历的事情:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Diagnostics;
using System.IO;
using System.Xml.Serialization;
namespace Playground
{
    class Program
    {
        static string str = @"<report>
    <residential>
        <dwelling />
        <property />
        <detachedStructures />
    </residential>
</report>";
        static void Main(string[] args)    
        {
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str));
            XmlSerializer s = new XmlSerializer(typeof(report));            
            report r = s.Deserialize(ms) as report;            
            MemoryStream ms2 = new MemoryStream();
            s.Serialize(ms2, r);
            ms2.Position = 0;
            string output = new StreamReader(ms2).ReadToEnd();
            System.Diagnostics.Debugger.Break();
        }        
    }
    [Serializable]
    [XmlRoot("report")]
    public class report
    {
        [XmlElement("residential")]
        public XmlElement residential;
        [XmlElement("residentialCaseHeader")]
        public residentialCaseHeader residentialCaseHeader;
    }
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class residentialCaseHeader
    {
    }
}

注意:在反序列化步骤之后,我注意到一件非常奇怪的事情是它说"r.residential"的元素名称是"住宅"。

以下是程序的输出:

<?xml version="1.0"?>
<report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <residential>
    <dwelling />
  </residential>
</report>

看来我只是得到了我的住宅元素的第一个孩子......任何人都可以理解这一点并告诉我我做错了什么吗?

XmlSerializer 正在删除元素

考虑使用 '[XmlAnyElement']

类似的东西

[Serializable]
[XmlRoot("report")]
public class report
{
    [XmlAnyElement("residential")]
    public XmlElement[] residential;
    [XmlElement("residentialCaseHeader")]
    public residentialCaseHeader residentialCaseHeader;
}

报表类应与所有 XML 元素匹配。因此,元素住宅应该有另一类,包括田野住宅、财产、独立结构。

所以这就是我要用它做的。

[Serializable]
public class Residential
{
    public string dwelling;
    public string property;
    public string detachedStructures;
}
[Serializable]
public class report
{
   public Residential residential;
}