C# 永远不会调用XmlSerializer中重写的反序列化

C# 永远不会调用XmlSerializer中重写的反序列化,c#,extend,xmlserializer,C#,Extend,Xmlserializer,我慢慢地感觉到我的理智在边缘磨损,而我的思想在慢慢地枯竭 我想扩展XmlSerializer,因为某些原因它不支持反序列化通知 我有以下代码: public class NotificationXmlSerializer : XmlSerializer { public NotificationXmlSerializer(Type type) : base(type) { } protected override object Deserial

我慢慢地感觉到我的理智在边缘磨损,而我的思想在慢慢地枯竭

我想扩展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);
    }
但是,如果我在反序列化覆盖中放置断点,它将永远不会被命中!即使我故意在那个里抛出一个异常,程序功能也是正常的,所以我确信它永远不会被命中

为什么他们让我重写一个反序列化的内部方法,而不让我通过它影响任何东西

我做错了什么


请首先向Max致意,因为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);
…
即使从所有其他
反序列化
方法调用此方法(
反序列化(XmlReader,string,XmlDeserializationEvents)
),但这并不意味着控制流必须以
反序列化(XmlSerializationReader)
结束


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

首先,正如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);
…
即使从所有其他
反序列化
方法调用此方法(
反序列化(XmlReader,string,XmlDeserializationEvents)
),但这并不意味着控制流必须以
反序列化(XmlSerializationReader)
结束


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

+1这就是我对reflector的了解-内部流程相当复杂,我也不建议OP在此场景中依赖覆盖。我知道我应该更仔细地阅读MSDN,但在本例中,它看起来非常像一种扩展功能的传统方式——内部方法,它做了很多工作,然后用简化的参数调用反序列化。我被我的假设愚弄了,它必须是它在逻辑上看起来的样子。@Max如果你想要可扩展性-忘记
XmlSerializer
。使用……你自己的序列化程序。就我所知,没有其他可行的选择了。。发牢骚。关于XmlSerializer,似乎有很多事情可以更好地实现——例如,如果序列化程序在序列化时将具体类型保存为属性,而不是直接拒绝接口,那么当他们已经完成所有其他工作时,这可能会很方便。无论如何,谢谢+1这就是我与反射器的距离-内部流程相当复杂,我也不建议OP在这种情况下依赖覆盖。我知道我应该更仔细地阅读MSDN,但在本例中,它看起来非常像一种扩展功能的传统方式——内部方法,它做了很多工作,然后用简化的参数调用反序列化。我被我的假设愚弄了,它必须是它在逻辑上看起来的样子。@Max如果你想要可扩展性-忘记
XmlSerializer
。使用……你自己的序列化程序。就我所知,没有其他可行的选择了。。发牢骚。关于XmlSerializer,似乎有很多事情可以更好地实现——例如,如果序列化程序在序列化时将具体类型保存为属性,而不是直接拒绝接口,那么当他们已经完成所有其他工作时,这可能会很方便。无论如何,谢谢!