21

私はこのようなクラスを持っています:

public delegate void ChangedEventHandler(object sender, EventArgs e);
[Serializable]
public class valueDouble
{
    public event ChangedEventHandler Changed;
    public double value
    {
        get { return _value; }
        set 
        {
            _value = value;
            if (Changed != null)
            {
                Changed(this, EventArgs.Empty);
            }
        }
    }
    private double _value = 0;
}

また、シリアル化できず、イベント ハンドラーを追加する別のクラス (StepPulseblaster) もあります。

valDouble.Changed += new ChangedEventHandler(sc_PropertyChanged);

valueDouble クラスをシリアル化しようとすると、エラーが発生します。

The Type StepPulseblaster is not marked as serializable

行にコメントすると

valDouble.Changed += ...

もうエラーは発生しません。

いくつかのイベントが接続されているクラスをシリアル化するにはどうすればよいですか?

4

4 に答える 4

13

NonSerialized 属性はフィールドでのみ使用できるため、これを使用するには、フィールドを使用するようにコードを調整する必要があります。

次のようにイベントを作成してみてください。

[NonSerialized]
private ChangedEventHandler _changed;
public event ChangedEventHandler Changed
{
    add { _changed += value; }
    remove { _changed -= value; }
}

次に、value プロパティで、プロパティではなくフィールドを使用します。

public double value
{
    get { return _value; }
    set 
    {
        _value = value;
        if (_changed != null)
        {
            _changed(this, EventArgs.Empty);
        }
    }
}
private double _value = 0;
于 2013-05-14T14:24:15.267 に答える
1

[NonSerialized]この属性を使用して、イベントのシリアル化を回避します。

于 2012-05-30T13:15:40.733 に答える
1

StepPulseBlaster をシリアライズ可能としてマークするか、XmlIgnore 属性を使用して Changed がシリアライズされないようにします。

于 2012-05-30T13:19:15.123 に答える