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

Max*_*Max 1 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用它:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

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

为什么他们会让我覆盖一个内部方法Deserialize而不会让我影响它的任何东西?

我究竟做错了什么?

最好的问候,马克斯

Ond*_*cny 5

首先,正如MSDN所说,该方法仅用于内部目的:

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

其次,如果你看一下XmlSerializerReflector,你会发现调用这个方法的唯一地方.简化的控制流程是:

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);
…
Run Code Online (Sandbox Code Playgroud)

即使Deserialize(XmlReader, string, XmlDeserializationEvents)从所有其他Deserialize方法调用此方法(),也不意味着控制流必须最终进入Deserialize(XmlSerializationReader).

我的建议:获取参考源XmlSerializer,研究行为,或者以另一种方式解决问题,或者以调用覆盖的方式调整外部条件.就个人而言,我会避免依赖于覆盖该方法.您将获得更稳定的行为,防止与框架的未来版本的兼容性问题.

  • @Max如果你想要可扩展性 - **忘记**关于`XmlSerializer`.并使用......你自己的序列化器.据我所知,没有其他可行的选择. (2认同)