1

クラスの構造への将来の追加を模倣するために、クラスをシリアル化し、それを 2 番目のクラスに逆シリアル化しようとしています。

Imports System.IO
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary

<Serializable()> _
Public Class Serial
    Implements ISerializable


    Public Num1 As Integer
    Public Num2 As Integer

    Protected Sub New(ByVal Info As SerializationInfo, ByVal Context As StreamingContext)
        With Info
            Num1 = .GetInt32("Num1")
            Num2 = .GetInt32("Num2")

        End With
    End Sub

    Public Sub GetObjectData(info As System.Runtime.Serialization.SerializationInfo, context As System.Runtime.Serialization.StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData

        With info
            .FullTypeName = "ObjectSerialization. Serial"
            .AddValue("Num1", Num1)
            .AddValue("Num2", Num2)
        End With
    End Sub
End Class

<Serializable()> _
Public Class Serial2
    Implements ISerializable


    Public Num1 As Integer
    Public Num2 As Integer
    Public Num3 As Integer

    Protected Sub New(ByVal Info As SerializationInfo, ByVal Context As StreamingContext)
        With Info
            Num1 = .GetInt32("Num1")
            Num2 = .GetInt32("Num2")
            Num3 = .GetInt32("Num3")
        End With
    End Sub


    Public Sub GetObjectData(info As System.Runtime.Serialization.SerializationInfo, context As System.Runtime.Serialization.StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData

        With info
            .FullTypeName = "ObjectSerialization. Serial"
            .AddValue("Num1", Num1)
            .AddValue("Num2", Num2)
            .AddValue("Num3", Num3)
        End With
    End Sub
End Class

以下のコードで逆シリアル化しようとすると、例外が発生します (タイプ ObjectSerialization を読み込めません。逆シリアル化にはシリアルが必要です)。誰かが私を正しい方向に向けることができますか?

Dim s1 As New Serial
Dim s2 As New Serial2
s1.Num1 = 99
s1.Num2 = 500

Dim fs As New FileStream("DataFile.dat", FileMode.Create)
Dim formatter As New BinaryFormatter
Try
    formatter.Serialize(fs, s1)
Catch ex As SerializationException
    Console.WriteLine("Failed to serialize. Reason: " & ex.Message)
Finally
    fs.Close()
End Try

fs = New FileStream("DataFile.dat", FileMode.Open)
Try
    formatter = New BinaryFormatter

    s2 = formatter.Deserialize(fs)
Catch ex As SerializationException

    Console.WriteLine("Failed to deserialize. Reason: " & ex.Message)
    Throw
Finally
    fs.Close()
End Try

End Sub
4

2 に答える 2

1

ObjectSerialization のスペースを削除しようとしましたか。シリアルで ObjectSerialization.Serial を使用するだけですか?

この変更の後、あなたのコードは私のマシンで機能し、引数なしのパブリックコンストラクターを追加しました

次のこともできます。

Try
    formatter = New BinaryFormatter
    Dim tmp As Serial = formatter.Deserialize(fs)
    s2.Num1 = tmp.Num1
    s2.Num2 = tmp.Num2
Catch ex As SerializationException

    Console.WriteLine("Failed to deserialize. Reason: " & ex.Message)
    Throw
Finally
    fs.Close()
End Try

プロパティを 1 つずつコピーする代わりに、次のような一般的なアプローチを使用できます: http://www.codeproject.com/Articles/173664/Copy-Properties-From-One-Object-To-Another

于 2013-10-19T20:12:24.117 に答える