(De)使用一个类序列化不同的根元素名称

Hen*_*nda 9 c# xml-serialization

我有几个具有不同根元素的XML文件,但是相同类型的子元素,我希望能够创建一个单独的类来保存不同的根元素,而另一个类来保存每个子元素.以下是XML文件外观的两个示例.

档案1:

<?xml version="1.0" encoding="utf-8" ?>
<Sandra>
  <Address>
    <Street></Street>
    <Number></Number>
  </Address>
</Sandra>
Run Code Online (Sandbox Code Playgroud)

文件2:

<?xml version="1.0" encoding="utf-8" ?>
<John>
  <Address>
    <Street></Street>
    <Number></Number>
  </Address>
</John>
Run Code Online (Sandbox Code Playgroud)

我希望能够使用2个类来序列化和反序列化,例如:

[Serializable]
[XmlRoot]
public class Person
{
    [XmlElement("Address")]
    public List<Address> Adresses { get; set; }
}

[Serializable]
public class Address
{
    public string Street { get; set; }

    public string Number { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下方法阅读它们:

    var ser = new XmlSerializer(typeof(Person));
    var reader = XmlReader.Create("person1.xml");
    var person = (Person)ser.Deserialize(reader);
Run Code Online (Sandbox Code Playgroud)

但我得到了"There is an error in XML document (2, 2).",因为解串器是期望<"Person">根元素而不是<"John"><"Paul">.如果我改变它的工作正常[XmlRoot],[XmlRoot("John")]但这正是我在这里要避免的.

此外,我必须能够使用相同的奇怪XML结构将其序列化,因此我需要将根元素名称存储在Person类中.

我知道我可以简单地创建自己的(de)序列化器,但我想知道是否可以使用现有方法实现它.

编辑1 :(回滚).

编辑2:回滚"编辑1"的修改,因为我找到了一种更简单的方法来实现我所需要的.请参阅下面的答案.

Hen*_*nda 9

找到了解决我问题的简洁快捷的方法!我只需在实例化XmlSerializer时使用XmlRootAttribute.这样我就可以在运行时设置根元素的名称.

var personsName = "Sandra";
var ser = new XmlSerializer(typeof(Person), 
   new XmlRootAttribute { ElementName = personsName });
var reader = XmlReader.Create("person1.xml");
var person = (Person)ser.Deserialize(reader);
Run Code Online (Sandbox Code Playgroud)

当然,如果我想序列化它也会以相同的方式工作.