C# 序列化我的类失败,因为有一个eventhandler

C# 序列化我的类失败,因为有一个eventhandler,c#,serialization,event-handling,C#,Serialization,Event Handling,我没想到会遇到这个错误。我想我在别的地方做错了什么 我有一个MVVM应用程序 我的模型可以使用二进制格式化程序对其自身进行序列化。这很好用 今天,我在模型中添加了一个事件处理程序,并且包含该模型的viewmodel订阅了该事件 现在,当我尝试序列化模型时,我得到一个错误,因为我的viewmodel(按设计)不可序列化 我确信这取决于对该活动的订阅,因为我已经删除了订阅(仅此而已),并且序列化再次起作用 我无法将[NonSerialized]属性应用于处理程序,因为它不是字段 有没有办法解决这个问

我没想到会遇到这个错误。我想我在别的地方做错了什么

我有一个MVVM应用程序

我的模型可以使用
二进制格式化程序
对其自身进行序列化。这很好用

今天,我在模型中添加了一个事件处理程序,并且包含该模型的viewmodel订阅了该事件

现在,当我尝试序列化模型时,我得到一个错误,因为我的viewmodel(按设计)不可序列化

我确信这取决于对该活动的订阅,因为我已经删除了订阅(仅此而已),并且序列化再次起作用

我无法将
[NonSerialized]
属性应用于处理程序,因为它不是字段


有没有办法解决这个问题?

您可以将事件设置为如下字段:

    [NonSerialized]
    private EventHandler _eventHandler;

    public event EventHandler MyEvent
    {
        add { _eventHandler += value; }
        remove { _eventHandler -= value; }
    }
[NonSerialized]
private EventHandler _nonSerializableeventHandler;
private EventHandler _eventHandler;

public event EventHandler MyEvent
{
    add
    {
        if (value.Method.DeclaringType.IsSerializable)
            _eventHandler += value;
        else
            _nonSerializableeventHandler += value;
    }
    remove
    {
        {
            if (value.Method.DeclaringType.IsSerializable)
                _eventHandler -= value;
            else
                _nonSerializableeventHandler -= value;
        }
    }
} 

您可以将事件设置为如下字段:

    [NonSerialized]
    private EventHandler _eventHandler;

    public event EventHandler MyEvent
    {
        add { _eventHandler += value; }
        remove { _eventHandler -= value; }
    }
[NonSerialized]
private EventHandler _nonSerializableeventHandler;
private EventHandler _eventHandler;

public event EventHandler MyEvent
{
    add
    {
        if (value.Method.DeclaringType.IsSerializable)
            _eventHandler += value;
        else
            _nonSerializableeventHandler += value;
    }
    remove
    {
        {
            if (value.Method.DeclaringType.IsSerializable)
                _eventHandler -= value;
            else
                _nonSerializableeventHandler -= value;
        }
    }
} 
您可以这样做:

[field:NonSerialized]
public event EventHandler MyEvent;
您可以这样做:

[field:NonSerialized]
public event EventHandler MyEvent;
我不知道这有多有用,但是

…扩展Pieter提到的内容,您还可以将多个委托处理程序包装到同一事件中,因此(理论上)可以通过执行以下操作使您的事件实际上既可序列化又不可序列化:

    [NonSerialized]
    private EventHandler _eventHandler;

    public event EventHandler MyEvent
    {
        add { _eventHandler += value; }
        remove { _eventHandler -= value; }
    }
[NonSerialized]
private EventHandler _nonSerializableeventHandler;
private EventHandler _eventHandler;

public event EventHandler MyEvent
{
    add
    {
        if (value.Method.DeclaringType.IsSerializable)
            _eventHandler += value;
        else
            _nonSerializableeventHandler += value;
    }
    remove
    {
        {
            if (value.Method.DeclaringType.IsSerializable)
                _eventHandler -= value;
            else
                _nonSerializableeventHandler -= value;
        }
    }
} 
我不知道这有多有用,但是

…扩展Pieter提到的内容,您还可以将多个委托处理程序包装到同一事件中,因此(理论上)可以通过执行以下操作使您的事件实际上既可序列化又不可序列化:

    [NonSerialized]
    private EventHandler _eventHandler;

    public event EventHandler MyEvent
    {
        add { _eventHandler += value; }
        remove { _eventHandler -= value; }
    }
[NonSerialized]
private EventHandler _nonSerializableeventHandler;
private EventHandler _eventHandler;

public event EventHandler MyEvent
{
    add
    {
        if (value.Method.DeclaringType.IsSerializable)
            _eventHandler += value;
        else
            _nonSerializableeventHandler += value;
    }
    remove
    {
        {
            if (value.Method.DeclaringType.IsSerializable)
                _eventHandler -= value;
            else
                _nonSerializableeventHandler -= value;
        }
    }
} 

请注意,这只是BinaryFormatter的众多缺陷之一。在我看来,它不是理想的序列化程序。我建议您查看XmlSerializer、DataContractSerializer或protobuf netFor info,这只是BinaryFormatter的众多缺陷之一。在我看来,它不是理想的序列化程序。我建议您查看XmlSerializer、DataContractSerializer或protobuf net