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