从不调用XmlSerializer中的重写反序列化

时间:2011-03-06 17:21:51

标签: c# extend xmlserializer

我慢慢地感觉到我的理智在边缘磨损,而我的思绪慢慢消失。

我想扩展XmlSerializer,由于某种原因它不支持反序列化通知。

我有以下代码:

public class NotificationXmlSerializer : XmlSerializer
{
    public NotificationXmlSerializer(Type type)
        : base(type)
    { 
    }

    protected override object Deserialize(XmlSerializationReader reader)
    {
        var x = base.Deserialize(reader);
        var methods = x.GetType().GetMethods().Where(method => method.GetCustomAttributes(true).Any(attr => attr is OnDeserializedAttribute));

        return x;
    }
}

并以这种方式使用它:

    using (MemoryStream fs = new MemoryStream())
    {
        var x = new NotificationXmlSerializer(typeof(int));
        x.Serialize(fs, 5);
        fs.Seek(0, SeekOrigin.Begin);
        var y = x.Deserialize(fs);
    }

但是,如果我在Deserialize覆盖中放置一个断点,它永远不会被击中!即使我故意在那里抛出异常,程序功能也是正常的,所以我确信它永远不会被击中。

为什么他们会让我覆盖内部方法反序列化而不会让我对它产生任何影响?

我做错了什么?

最好的问候,Max

1 个答案:

答案 0 :(得分:5)

首先,正如MSDN所说,该方法仅供内部使用:

  

此API支持.NET Framework基础结构,不能直接在您的代码中使用。

其次,如果您使用Reflector查看XmlSerializer,您将发现调用此方法的唯一位置。简化的控制流程是:

public object Deserialize(XmlReader xmlReader, string encodingStyle, XmlDeserializationEvents events)
{
    …
    try
    {
        if (this.primitiveType != null)
        {
            …
            return this.DeserializePrimitive(xmlReader, events);
        }
        if ((this.tempAssembly == null) || this.typedSerializer)
        {
            XmlSerializationReader reader = …
            try
            {
                return this.Deserialize(reader);
…

即使从所有其他Deserialize(XmlReader, string, XmlDeserializationEvents)方法调用此方法(Deserialize),也不意味着控制流必须以Deserialize(XmlSerializationReader)结尾。

我的建议:获取XmlSerializer的参考源,研究行为,并以其他方式解决问题或以调用覆盖的方式调整外部条件。我个人避免依赖覆盖方法。您将最终使用更稳定的行为防止兼容性问题与该框架的未来版本。