【问题标题】:Do .NET 3/4 Permits Events to be Binary De/Serialized?.NET 3/4 是否允许对事件进行二进制反序列化/序列化?
【发布时间】:2011-01-21 02:40:56
【问题描述】:

在 .NET(至少

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

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

但似乎没有一个能完全满足作者和用户的需求。

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

【问题讨论】:

  • 这个问题不是 VB.NET 特有的——它是 .NET 的工作原理。
  • 但是使用 C# ve 可以使用 [Field:NonSerialized] 找到更“灵活”的解决方案。至少,没有特别需要编写补充帮助代码来解决问题。
  • @serhio:那个属性不也适用于VB吗?为什么不?我不是在谈论WithEvents
  • @serhio:试试“<Field: NonSerialized> _
  • @John,不要建议你不知道或从未尝试过的东西,这在 VB.NET 中不起作用

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


【解决方案1】:

通过创建委托成员来处理事件。如果您自己显式定义此成员,您应该能够将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

【讨论】:

  • 感谢语法。我想我从未见过RaiseEvent 语法。
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2017-12-22
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多