VB.NET序列化错误

VB.NET序列化错误,vb.net,winforms,visual-studio-2010,serialization,binary-serialization,Vb.net,Winforms,Visual Studio 2010,Serialization,Binary Serialization,我试图在我的VB解决方案中序列化主类。我在类的顶部添加了Serializable属性,如下所示: <Serializable()> Public Class Form1 当我调用此方法时,我得到一个错误: 在程序集System.Windows.Forms中键入“System.Windows.Forms.Form”, 版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089' 未标记为可序列化 我猜这是因为您无法序列化附加到类或其他对象的表单

我试图在我的VB解决方案中序列化主类。我在类的顶部添加了Serializable属性,如下所示:

<Serializable()>
Public Class Form1
当我调用此方法时,我得到一个错误:

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

我猜这是因为您无法序列化附加到类或其他对象的表单,但我真的不知道我在做什么

我能否以某种方式序列化Form1类中包含的所有对象而不出现此错误?我不想存储任何关于表单控件的数据,我只需要保存我在
Form1
类顶部定义的所有对象


谢谢您的帮助。

由于
表单
不可序列化,因此无法序列化表单本身。(表单未附加到
Form1
类。您的
Form1
类就是表单,因为它派生自
System.Windows.Forms.form

但是,您可以只序列化要序列化的对象:

Public Sub serializeThis()
    Dim fStream As FileStream
    Try
        fStream = New FileStream("C:\ObjectData.bin", FileMode.Create)
        Dim bfmtr As New BinaryFormatter
        bfmtr.Serialize(fStream, Me)
        fStream.Close()
    Catch ex As Exception
        MsgBox("Failed to serialize: " & ex.Message)
        Throw
    End Try
End Sub
Public Sub SerializeThis()
    Dim fStream As FileStream
    Try
        fStream = New FileStream("C:\ObjectData.bin", FileMode.Create)
        Dim bfmtr As New BinaryFormatter()

        bfmtr.Serialize(fStream, object1)
        bfmtr.Serialize(fStream, object2)
        bfmtr.Serialize(fStream, object3)
        ' ...

        fStream.Close()
    Catch ex As Exception
        MsgBox("Failed to serialize: " & ex.Message)
        Throw
    End Try
End Sub
有两件事需要注意:

  • 要序列化的所有对象(object1、object2等)的类必须标记为
    。您可以在文档中对此进行检查(例如:标记为可序列化)
  • 确保以相同的顺序反序列化对象

谢谢,这就解释了错误。问题是我在Form1类中有很多这样的对象(据我所知,所有对象都是可序列化的),我希望避免显式序列化每个对象。如果我将要持久化的对象移动到一个单独的类中,这会起作用吗?否则,你能解释一下为什么我需要按相同的顺序反序列化吗?Cheers@Andrew:是的,把他们分在一个单独的班上应该行得通。您需要将此类标记为
。将用户界面(Form1)和数据(新类)分开是一种很好的做法。@Andrew:您需要按相同的顺序对它们进行反序列化,因为您的文件流将包含
bytesForObject1 bytesForObject2…
,并且用
bytesForObject1
重建object2将不起作用。;-)