2

VB ソリューションでメイン クラスをシリアル化しようとしています。次のように、クラスの上部に Serializable 属性を追加しました。

<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

このメソッドを呼び出すと、次のエラーが発生します。

アセンブリ 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' に 'System.Windows.Forms.Form' と入力すると、シリアル化可能としてマークされません。

これは、クラスにアタッチされているフォームをシリアル化できないためだと思いますが、実際に何をしているのかわかりません。

このエラーを発生させずに、Form1 クラスに含まれるすべてのオブジェクトをシリアル化できますか? フォーム コントロールに関するデータを保存したくありませんForm1。クラスの先頭で定義したすべてのオブジェクトを保存する必要があるだけです。

助けてくれてありがとう。

4

1 に答える 1

3

Formはシリアル化できないため、フォーム自体をシリアル化することはできません。(フォームはクラスに関連付けられていません。フォームは から派生しているため、クラスフォームです。)Form1Form1System.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

注意すべき点が 2 つあります。

  • シリアル化するすべてのオブジェクト (object1、object2、...) のクラスは、としてマークする必要があります<Serializable()>。これはドキュメントで確認できます (例: Hashtableはシリアライズ可能とマークされています)。
  • 必ず同じ順序でオブジェクトを逆シリアル化してください。
于 2011-04-05T08:39:35.497 に答える