c# - .NET 3/4 是否允许对事件进行二进制反序列化?

标签 c# .net vb.net serialization .net-2.0

在 .NET 中(至少 <=2)序列化对象时会出现问题,当这些事件由不可序列化的对象(如 Windows 窗体)处理时引发事件。

由于 VB.NET 实现事件的方式,当您序列化一个对象时,它的事件也会被序列化(因为事件实际上是使用隐藏的多播委托(delegate)字段实现的)。这样做的一个副作用是,任何处理由被序列化的对象引发的事件的对象都将被视为对象图的一部分,并且也将被序列化。

可以找到一些解决方法,实现自定义序列化或使用委托(delegate)而不是事件:

然而,它们似乎都不能完全满足作者和用户。

.NET 3/4 是否解决了这个问题?

最佳答案

事件通过创建委托(delegate)成员来处理。如果您自己明确定义此成员,则应该能够向其添加 NonSerialized 属性。 See this thread for a reference.

例如:

Public Delegate Sub MyEventDelegate()

<NonSerialized()>Private m_MyEventDelegate As MyEventDelegate

Public Custom Event MyEvent As MyEventDelegate
    AddHandler(ByVal value As MyEventDelegate)
        m_MyEventDelegate = DirectCast(System.Delegate.Combine(m_MyEventDelegate, value), MyEventDelegate)
    End AddHandler

    RemoveHandler(ByVal value As MyEventDelegate)
        m_MyEventDelegate = DirectCast(System.Delegate.Remove(m_MyEventDelegate, value), MyEventDelegate)
    End RemoveHandler

    RaiseEvent()
        If m_MyEventDelegate IsNot Nothing Then
            m_MyEventDelegate.Invoke()
        End If
    End RaiseEvent
End Event

关于c# - .NET 3/4 是否允许对事件进行二进制反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2335931/

相关文章:

c# - 使用 Lambda 表达式进行字符串连接

c# - 以 Caret 开头并以 Dollar 结尾的单词不会产生预期的结果

c# - 当源和目标都在同一个远程文件服务器上时,是否远程处理 File.Copy?

c# - 我的 http 模块中未触发 BeginRequest 事件

vb.net - 在SQL Server 2008 R2数据库中存储图像

c# - 使用 C# 将 AppDomain 映射到一个友好的名称

c# - 删除所有 CDATA 节点并替换为编码文本

.net - Powershell 'Start-Job` 与 'Start-Process'

vb.net - WebRequest.GetResponse - 远程服务器返回错误 : (404) Not Found

asp.net - 减少 VB.NET 的 if 代码量