使用DataContractSerializer时PostSharp?

时间:2010-04-17 17:23:50

标签: wcf serialization datacontractserializer postsharp

我有一个在类上实现INotifyPropertyChanged的Aspect。该方面包括以下内容:

    [OnLocationSetValueAdvice, MethodPointcut("SelectProperties")]
    public void OnPropertySet(LocationInterceptionArgs args)
    {
        var currentValue = args.GetCurrentValue();
        bool alreadyEqual = (currentValue == args.Value);

        // Call the setter
        args.ProceedSetValue();

        // Invoke method OnPropertyChanged (ours, the base one, or the overridden one).
        if (!alreadyEqual)
            OnPropertyChangedMethod.Invoke(args.Location.Name);
    }

当我正常实例化类时,这很好用,但是当我使用DataContractSerializer反序列化类时遇到问题。这绕过了构造函数,我猜测它会干扰PostSharp设置自己的方式。这最终会在截获的属性setter中导致NullReferenceException,但在它调用自定义OnPropertySet之前,所以我猜它会干扰设置LocationInterceptionArgs。

还有其他人遇到过这个问题吗?有没有办法解决它?


我做了一些研究,发现我可以通过这样做解决问题:

    [OnDeserializing]
    private void OnDeserializing(StreamingContext context)
    {
        AspectUtilities.InitializeCurrentAspects();
    }

我想,好吧,那不是太糟糕,所以我尝试在我看来这样做:

    private IEnumerable<MethodInfo> SelectDeserializing(Type type)
    {
        return
            type.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).Where(
                t => t.IsDefined(typeof (OnDeserializingAttribute), false));
    }

    [OnMethodEntryAdvice, MethodPointcut("SelectDeserializing")]
    public void OnMethodEntry(MethodExecutionArgs args)
    {
        AspectUtilities.InitializeCurrentAspects();  
    }

不幸的是,尽管它正确拦截了该方法,但它不起作用。我认为对InitializeCurrentAspects的调用没有得到正确的转换,因为它现在位于Aspect中,而不是直接在Aspect加强类中。有没有办法可以干净地自动化这个,这样我就不用担心在每个想要拥有Aspect的课程上调用它?

1 个答案:

答案 0 :(得分:2)

最近添加了对序列化的支持,并且可以作为修补程序使用。

http://www.sharpcrafters.com/downloads/postsharp-2.0/hot-fixes