例えばこんなクラスがあります。
CustomClass
[Serializable]
public class CustomClass : INotifyPropertyChanged
{
private bool _checkbox;
public int Value { get; set; }
public bool Checkbox
{
get
{
return _checkbox;
}
set
{
_checkbox = value;
NotifyPropertyChanged("Checkbox");
}
}
public int SecondValue { get; set; }
public string Text { get; set; }
public event PropertyChangedEventHandler PropertyChanged; ///エラーが起きる箇所
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
これをコンパイルすると、
public event PropertyChangedEventHandler PropertyChanged;
がシリアライズ出来ないとしてエラーが発生します。
このために、event部分をNonSerializedに指定する必要があるのですが、
CustomClass
[Serializable]
public class CustomClass : INotifyPropertyChanged
{
private bool _checkbox;
public int Value { get; set; }
public bool Checkbox
{
get
{
return _checkbox;
}
set
{
_checkbox = value;
NotifyPropertyChanged("Checkbox");
}
}
public int SecondValue { get; set; }
public string Text { get; set; }
[NonSerialized] ///変更点ここ
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
とやるとまたしてもエラーが起きます。
NonSerializedがフィールドタイプではない、と怒られるので、フィールドタイプとしてきちんと指定する必要があります。
CustomClass
[Serializable]
public class CustomClass : INotifyPropertyChanged
{
private bool _checkbox;
public int Value { get; set; }
public bool Checkbox
{
get
{
return _checkbox;
}
set
{
_checkbox = value;
NotifyPropertyChanged("Checkbox");
}
}
public int SecondValue { get; set; }
public string Text { get; set; }
[field: NonSerialized] ///変更点ここ
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
これで INotifyPropertyChanged のあるクラスのシリアライズが出来ます。