序列化实现INotifyPropertyChanged的类的实例时出现SerializationException

时间:2012-01-16 11:33:56

标签: c# .net serialization

我正在尝试序列化我班上的一个字段。对它进行序列化很好,它带有一个获取SerializationException。

字段是:private readonly ObservableCollection<CellVM> Values; 例外是

Type System.ComponentModel.PropertyChangedEventManager in assembly WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 is not marked as serializable.

我的目标是框架3.5。

我发现了一些建议,它可能是可观察集合序列化的问题,但应该由3.5 sp1修复。

不知道如何解决这个问题,任何想法?谢谢。

CellVM类:

[Serializable]
public class CellVM:ANotifyPropertyChanged
{
    public Cell model;

    public int X
    {
        get { return model.X; }
        set { model.X = value; OnPropertyChanged("X"); }
    }

    public int Y
    {
        get { return model.Y; }
        set { model.Y = value; OnPropertyChanged("Y"); }
    }

    public string Value
    {
        get
        {
            return  model.ActualValue;
        }
        set { model.ActualValue = value; OnPropertyChanged("Value"); }
    }

    [NonSerialized]
    private bool _isActive;
    public bool IsActive
    {
        get
        {
            return _isActive;
        }
        set
        {
            _isActive = value;
            OnPropertyChanged("IsActive");
            OnPropertyChanged("BackgroundBrush");
            OnPropertyChanged("HighlightBrush");
        }
    }

    public bool IsReadOnly
    {
        get
        {
            if(model.InitialValue.Equals(model.RightValue))
            {
                return true;
            }
            return false;
        }
    }

    public bool IsHighLighted
    {
        get;
        set;
    }

    private bool _isInvalid;
    public bool IsInvalid
    {
        get { return _isInvalid; }
        set
        {
            _isInvalid = value;
            OnPropertyChanged("IsInvalid");
            OnPropertyChanged("BackgroundBrush");
        }
    }

    private bool _isValueMode;
    public bool IsValueMode
    {
        get
        {
            return _isValueMode;
        }
        set
        {
            _isValueMode = value;

            OnPropertyChanged("IsValueMode");
            OnPropertyChanged("ValueVisibility");
            OnPropertyChanged("PossibilityVisibility");
        }
    }

    [NonSerialized]
    private FontWeight _valueFontWeight;
    public FontWeight ValueFontWeight
    {
        get
        {
            return _valueFontWeight;
        }
        set { _valueFontWeight = value; OnPropertyChanged("ValueFontWeight");}
    }

    [NonSerialized]
    private Brush _valueColor;
    public Brush ValueColor
    {
        get
        {
            if(_valueColor == null)
            {
                return new SolidColorBrush(Colors.Black);
            }
            return _valueColor;
        }
        set { _valueColor = value; OnPropertyChanged("ValueColor"); }
    }

    public Visibility ValueVisibility
    {
        get
        {
            if(IsValueMode)
            {
                return Visibility.Visible;
            }
            return Visibility.Hidden;
        }
    }

    public Visibility PossibilityVisibility
    {
        get
        {
            if (!IsValueMode)
            {
                return Visibility.Visible;
            }
            return Visibility.Hidden;
        }
    }

    private bool _isCheckInvalid;
    public bool IsCheckInvalid
    {
        get
        {
            return _isCheckInvalid;
        }
        set
        {
            _isCheckInvalid = value;
            OnPropertyChanged("IsCheckInvalid");
            OnPropertyChanged("HighlightBrush");
        }
    }

    public Brush HighlightBrush
    {
        get
        {
            if(IsActive && IsReadOnly)
            {
                return ColorManager.CellActive;
            }

            if (IsCheckInvalid)
            {
                ColorAnimation animation = new ColorAnimation
                {
                    From = Colors.Firebrick,
                    To = Colors.WhiteSmoke,
                    Duration = new Duration(TimeSpan.FromSeconds(1)),
                    AutoReverse = true
                };
                SolidColorBrush brush = new SolidColorBrush(Colors.Firebrick);
                animation.RepeatBehavior = RepeatBehavior.Forever;
                animation.AccelerationRatio = 0.5;

                brush.BeginAnimation(SolidColorBrush.ColorProperty, animation);

                return brush;
            }

            return new SolidColorBrush(Colors.Transparent);
        }
    }

    public Brush BackgroundBrush
    {
        get
        {

            if (IsActive)
            {
                if (!IsReadOnly)
                {
                    return ColorManager.CellActive;
                }
            }
            if (IsInvalid)
            {
                return ColorManager.CellInvalid;
            }
            if (IsHighLighted)
            {
                return ColorManager.CellHighlighted;
            }

            return new SolidColorBrush(Colors.White);
        }
    }

    [NonSerialized]
    private Brush _backgroundAnimationBrush;
    public Brush BackgroundAnimationBrush
    {
        get { return _backgroundAnimationBrush; }
        set { _backgroundAnimationBrush = value;                OnPropertyChanged("BackgroundAnimationBrush"); }
    }

    public Brush PossibilitiesBrush
    {
        get
        {
            return new SolidColorBrush(PossibilitiesColor);
        }
    }

    private Colour _possibilitiesColor;
    public Colour PossibilitiesColor
    {
        get
        {
            if (_possibilitiesColor == null)
            {
                return new Colour(Colors.Black);
            }
            return _possibilitiesColor;
        }
        set
        {
            _possibilitiesColor = value;
            OnPropertyChanged("PossibilitiesColor");
            OnPropertyChanged("PossibilitiesBrush");
        }
    }

    public ObservableCollection<string> Possibilities
    {
        get { return model.Possibilities; }
        set 
        { 
            model.Possibilities = value; 
            OnPropertyChanged("Possibilities");
            OnPropertyChanged("PossibilityVisibility"); 
        }
    }

    private string _toolTip;
    public string ToolTip
    {
        get { return _toolTip; }
        set { _toolTip = value; OnPropertyChanged("ToolTip"); }
    }

    public CellVM(Cell model,bool isHighlighted)
    {
        this.model = model;
        IsValueMode = true;
        IsHighLighted = isHighlighted;
    }

    public void signalError(string message)
    {
        ToolTip = message;
        IsInvalid = true;
    }

    public void resetError()
    {
        if(IsCheckInvalid)
        {
            return;
        }
        ToolTip = null;
        IsInvalid = false;
    }


    public void AnimateError()
    {
        ColorAnimation animation = new ColorAnimation
        {
            From = Colors.Firebrick,
            To = Colors.Transparent,
            Duration = new Duration(TimeSpan.FromSeconds(1.5)),
            AutoReverse = false
        };
        animation.Completed += new EventHandler(animation_Completed);
        SolidColorBrush brush = new SolidColorBrush(Colors.Transparent);
        animation.AccelerationRatio = 0.5;

        BackgroundAnimationBrush = brush;
        brush.BeginAnimation(SolidColorBrush.ColorProperty, animation);
    }

    public void AnimateHint()
    {
        ColorAnimation animation = new ColorAnimation
        {
            From = Colors.DarkGreen,
            To = Colors.Transparent,
            Duration = new Duration(TimeSpan.FromSeconds(1.5)),
            AutoReverse = false
        };
        animation.Completed += new EventHandler(animation_Completed);
        SolidColorBrush brush = new SolidColorBrush(Colors.Transparent);
        animation.AccelerationRatio = 0.5;

        BackgroundAnimationBrush = brush;
        brush.BeginAnimation(SolidColorBrush.ColorProperty, animation);

    }

    private void animation_Completed(object sender, EventArgs e)
    {
        BackgroundAnimationBrush = null;
    }
}

CellVM SuperClass(祖先):

[Serializable]
public abstract class ANotifyPropertyChanged : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
}

1 个答案:

答案 0 :(得分:39)

尝试按PropertyChanged属性

标记事件[NonSerialized]

下面是事件的语法:(请参阅MSDN

[field:NonSerializedAttribute()] 
public event ChangedEventHandler Changed;