1

我正在尝试序列化/反序列化以下 XML 代码结构:

<Person>
    <Name/>
    <Age/>
    <Address>
        <BuildingNumber/>
        <Street/>
        <Town/>
        <PostCode/>
    </Address>
</Person>

使用类

public class Person {
    public string Name { get; set; }
    public int Age { get; set; }
    public Address Address { get; set; }
}

public class Address {
    public string BuildingNumber { get; set; }
    public string Street { get; set; }
    public string Town { get; set; }
    public string PostCode { get; set; }
}

IXmlSerializable在这两个类上都实现了(我知道,对于这个特定的例子来说,它是过度设计的,但它是我正在处理的一个相当复杂的项目所必需的!),序列化工作正常,但反序列化却不行。

问题出现在Person.ReadXml()方法中,我将其写为:

public void ReadXml(XmlReader reader) {
    reader.ReadStartElement();
    if (!reader.IsEmptyElement) {
        Name = reader.ReadElementContentAsString("Name", string.Empty);
        Age = reader.ReadElementContentAsInt("Age", string.Empty);
        Address = (Address)reader.ReadElementContentAs(typeof(Address), null, "Address", string.Empty);
        // Also failed: Address = (Address)reader.ReadElementContentAsObject("Address", string.Empty);
    }
    reader.ReadEndElement();
}

初始化的最后一行Address是抛出异常:

不能对具有子元素的元素调用 ReadElementContentAs() 方法。(Xml 异常)

基本上,我将如何处理带有子元素的元素IXmlSerializable

4

2 回答 2

3

我想你可以简单地XmlSerializer在这里使用:

XmlSerializer serializer = new XmlSerializer(typeof(Person));
Person person = (Person)serializer.Deserialize(reader);

序列化也很简单:

serializer.Serialize(stream, person);

如果您需要自定义 xml(不是您当前的情况),那么只需使用 xml 序列化属性。

于 2012-12-12T11:26:09.453 回答
0

你可以这样尝试:

public void ReadXml(XmlReader reader)
{
    reader.MoveToContent();
    reader.ReadStartElement();
    Name = reader.ReadElementString("Name");
    Age = Convert.ToInt32(reader.ReadElementString("Age"));
    var xmlSerializer = new XmlSerializer(typeof (Address));
    Address = (Address) xmlSerializer.Deserialize(reader);
    reader.ReadEndElement();
}
  • 请注意,每次都为地址新建一个 XmlSerializer 可能效率低下,并且缓存它可能是一个好主意。
  • 这将独立于地址是否实现 IXmlSerializable
  • 正如其他人所说,仅将 IXmlSerializable 用作最后的手段,如果属性可以工作,这是一种更好的方法。
于 2012-12-12T11:54:37.347 回答