【问题标题】:ReadXml not being called when using IXmlSerializable使用 IXmlSerializable 时未调用 ReadXml
【发布时间】:2012-05-22 09:57:17
【问题描述】:

我在尝试使用 IXmlSerializable 时遇到了一些问题。反序列化时,ReadXml 方法似乎没有被调用,而 WriteXml 却被调用。

这是代码的精简版。

public interface ICharacter { 
string FullName { get; set; }
}

public class Character : ICharacter, IXmlSerializable {
    public string FullName { get; set; }

    public Character() {
        //apply default character information
        FullName = string.Empty;
    }
}

public void ReadXml(XmlReader reader) {
    if (reader == null) return;
    //just using null to see if it's called, i've used a break point to check if it was fired
}

public void WriteXml(XmlWriter writer) {
    writer.WriteElementString("FullName", FullName);
}
}

要序列化和反序列化,我执行以下操作:

        //serialise example
        Character character = new Character();
        using (StringWriter stringWriter = new StringWriter()) {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(Character));
            xmlSerializer.Serialize(stringWriter, character);
            xml = stringWriter.ToString();
        }            

        //deserialise example 
        using (StringReader stringReader = new StringReader(xml)) {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(UserCharacter));
            _character = (Character)xmlSerializer.Deserialize(stringReader);
        }

我只是在这个类的设置上做错了吗?

【问题讨论】:

  • 您要发送到XmlSerializer 的 XML 是什么?
  • @saluce 感谢您的回复。问题是因为我试图使用不同的类来自定义序列化和反序列化。幸运的是,我设法纠正了这一点。我在下面添加了回复。再次感谢。

标签: c# .net xml serialization deserialization


【解决方案1】:

我最初的印象是从 IXmlSerializable 继承使我能够读取和写入所有传入的 xml 数据。但是,进行验证以确保类类型相同。因此我需要序列化和反序列化Character

我的目的是能够序列化子类。我通过使用WriteXml 方法并在该方法中使用反射来基于根节点获取关联类型来管理此问题。

我希望这个解释对其他人有所帮助。

【讨论】:

    【解决方案2】:
    public class UserCharacter : Character
    {
        public void ReadXml(XmlReader reader)
        {
            base.ReadXml(reader);
        }
        public void WriteXml(XmlWriter writer)
        {
            base.WriteXml(writer);
        }
    }
    

    【讨论】:

    • 虽然是个好主意,但异常如下:{"<Character xmlns=''> was not expected."}ReadXml 有机会被调用之前抛出异常。
    猜你喜欢
    • 2019-04-30
    • 2010-10-28
    • 2010-10-13
    • 2013-01-02
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多