Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net SerializationException,如何避免UserControl使用要序列化的事件?_.net_Vb.net_Serialization_User Controls - Fatal编程技术网

.net SerializationException,如何避免UserControl使用要序列化的事件?

.net SerializationException,如何避免UserControl使用要序列化的事件?,.net,vb.net,serialization,user-controls,.net,Vb.net,Serialization,User Controls,我尝试序列化一个对象,它抛出一个异常,如下所示。我假设它还试图序列化订阅我试图序列化的类的事件的UserControl。这是不可取的。那么如何避免序列化事件呢?(尽可能简单) 发生序列化异常: 在程序集中键入“System.Windows.Forms.UserControl” 'System.Windows.Forms,版本=2.0.0.0,区域性=中性, PublicKeyToken=b77a5c561934e089'未标记为可序列化 公共子发送数据(ByVal obj作为对象) 如果客户端已

我尝试序列化一个对象,它抛出一个异常,如下所示。我假设它还试图序列化订阅我试图序列化的类的事件的UserControl。这是不可取的。那么如何避免序列化事件呢?(尽可能简单)

发生序列化异常:

在程序集中键入“System.Windows.Forms.UserControl” 'System.Windows.Forms,版本=2.0.0.0,区域性=中性, PublicKeyToken=b77a5c561934e089'未标记为可序列化

公共子发送数据(ByVal obj作为对象)
如果客户端已连接,则
尝试
作为NetworkStream=Client.GetStream()的Dim ns
Dim bf=新的二进制格式化程序()
Dim ms=新内存流()
bf.Serialize(ms,obj)“<此处异常

您传递到例程中的对象似乎不可序列化。是否将usercontrol传递给此方法?如果是这样的话,您将需要传递您想要序列化的内容,我假设它可能是其中的数据结构?否则,尝试在对象上使用[Searilzable]属性,看看是否有效。

一个选项是实现并仅序列化您想要的内容

C#(我不确定VB)可用的另一个选项是定制添加/删除代码

[NonSerialized]  // prevents the m_changed field from being serialized.
private EventHandler m_changed;

public event Changed
{
  add
  {
    m_changed += value;
  }
  remove
  {
    m_changed -= value;
  }
}
如何避免序列化事件


解决方案是用[]属性标记类中的事件处理程序。

VB.NET将不允许对事件使用属性。由于VB.NET实现事件的方式,当序列化对象时,其事件也会被序列化,因为事件实际上是使用隐藏的多播委托字段实现的。以下是如何在vb中序列化期间删除处理程序的示例:

      <NonSerialized()> _
  Private PropertyChangedHandlers As New Generic.List(Of PropertyChangedEventHandler)

  ''' <summary>
  ''' stores parameter of event in a local nonserializable variable
  ''' </summary>
  ''' <remarks></remarks>
  Public Custom Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
     AddHandler(ByVal value As PropertyChangedEventHandler)
        If PropertyChangedHandlers Is Nothing Then
           PropertyChangedHandlers = New Generic.List(Of PropertyChangedEventHandler)()
        End If
        PropertyChangedHandlers.Add(value)
     End AddHandler

     RemoveHandler(ByVal value As PropertyChangedEventHandler)
        If value Is Nothing Or PropertyChangedHandlers Is Nothing Then
           Return
        End If

        PropertyChangedHandlers.Remove(value)
     End RemoveHandler

        RaiseEvent(ByVal sender As Object, ByVal e As PropertyChangedEventArgs)
            Dim pos As Int32
            Dim count As Int32
            Dim Element As PropertyChangedEventHandler
            If Me.PropertyChangedHandlers IsNot Nothing Then
                count = PropertyChangedHandlers.Count
                If count > 0 Then
                    For pos = (count - 1) To 0 Step -1
                        Element = PropertyChangedHandlers(pos)
                        Try
                            Element.Invoke(sender, e)
                        Catch ex As Exception
                            'Ignore any error generated
                        End Try
                    Next
                End If
            End If
        End RaiseEvent
  End Event
_
私有PropertyChangedHandler作为新的泛型.List(PropertyChangedEventHandler的列表)
''' 
''将事件的参数存储在局部不可序列化变量中
''' 
''' 
公共自定义事件PropertyChanged为PropertyChangedEventHandler实现INotifyPropertyChanged.PropertyChanged
AddHandler(作为PropertyChangedEventHandler的ByVal值)
如果PropertyChangedHandler不算什么,那么
PropertyChangedHandler=新的泛型.List(PropertyChangedEventHandler的)()
如果结束
PropertyChangedHandlers.Add(值)
EndAddHandler
RemoveHandler(ByVal值作为PropertyChangedEventHandler)
如果value为Nothing或PropertyChangedHandler为Nothing,则
返回
如果结束
PropertyChangedHandlers.Remove(值)
末端移除处理器
RaiseEvent(ByVal发送方作为对象,ByVal e作为属性ChangedEventArgs)
Dim pos As Int32
将计数设置为Int32
Dim元素作为属性ChangedEventHandler
如果Me.PropertyChangedHandler不是什么
count=PropertyChangedHandlers.count
如果计数>0,则
对于pos=(计数-1)到0步骤-1
元素=属性更改句柄(pos)
尝试
元素。调用(发送方,e)
特例
'忽略生成的任何错误
结束尝试
下一个
如果结束
如果结束
端部提升孔
结束事件

当我在另一个地方读到同样的内容时,我也这么认为,但它似乎是有效的。它确实编译并删除了我遇到的异常。
      <NonSerialized()> _
  Private PropertyChangedHandlers As New Generic.List(Of PropertyChangedEventHandler)

  ''' <summary>
  ''' stores parameter of event in a local nonserializable variable
  ''' </summary>
  ''' <remarks></remarks>
  Public Custom Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
     AddHandler(ByVal value As PropertyChangedEventHandler)
        If PropertyChangedHandlers Is Nothing Then
           PropertyChangedHandlers = New Generic.List(Of PropertyChangedEventHandler)()
        End If
        PropertyChangedHandlers.Add(value)
     End AddHandler

     RemoveHandler(ByVal value As PropertyChangedEventHandler)
        If value Is Nothing Or PropertyChangedHandlers Is Nothing Then
           Return
        End If

        PropertyChangedHandlers.Remove(value)
     End RemoveHandler

        RaiseEvent(ByVal sender As Object, ByVal e As PropertyChangedEventArgs)
            Dim pos As Int32
            Dim count As Int32
            Dim Element As PropertyChangedEventHandler
            If Me.PropertyChangedHandlers IsNot Nothing Then
                count = PropertyChangedHandlers.Count
                If count > 0 Then
                    For pos = (count - 1) To 0 Step -1
                        Element = PropertyChangedHandlers(pos)
                        Try
                            Element.Invoke(sender, e)
                        Catch ex As Exception
                            'Ignore any error generated
                        End Try
                    Next
                End If
            End If
        End RaiseEvent
  End Event