2

我想序列化我的VB解決方案中的主類。我已經添加了Serializable屬性在我班上的第一名,像這樣:VB.NET序列化錯誤

<Serializable()> 
Public Class Form1 

,我使用下面的代碼序列:

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 

當我把這個方法我越來越錯誤:

Type 'System.Windows.Forms.Form' in Assembly 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.

我猜這是因爲你不能序列附加到類或某事的形式,但我真的不知道我在做什麼。

是否可以序列化包含在我的Form1類中的所有對象,而不會收到此錯誤?我不想存儲任何關於表單控件的數據,我只需要保存Form1類頂部定義的所有對象。

感謝您的任何幫助。

回答

3

由於Form不可序列化,因此無法序列化表單本身。 (形式不是連接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, 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,對象2的對象的類.. )必須標記爲<Serializable()>。你可以在文檔中檢查這個(例如:Hashtable被標記爲可序列化)。
  • 一定要反序列化對象的順序相同。
+0

謝謝,這解釋了錯誤。問題是我在Form1類中有很多這樣的對象(據我所知,它們都是可序列化的),我希望避免顯式序列化每一個對象。如果我將我想要堅持的對象移動到一個單獨的類中,那會起作用嗎?否則,你能否解釋爲什麼我需要按同樣的順序進行反序列化?乾杯 – Flash 2011-04-05 09:28:56

+0

@安德魯:是的,把他們放在一個單獨的班級應該工作。你需要把這個類標記爲''。無論如何,將用戶界面(Form1)和數據(您的新類)分開是一種很好的做法。 – Heinzi 2011-04-05 11:22:26

+0

@Andrew:你需要以相同的順序反序列化它們,因爲你的文件流將包含'bytesForObject1 bytesForObject2 ...',並且重建'bytesForObject1'中的一個object2將不起作用。 ;-) – Heinzi 2011-04-05 11:23:49