无法加载类型ObjectSerialization。反序列化所需的序列号

时间:2013-10-19 19:58:16

标签: vb.net serialization

我正在尝试序列化一个类,然后将其反序列化为第二个类,模仿类的结构的未来添加,所以我试图Imlpement ISerializable

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

2 个答案:

答案 0 :(得分: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

您可以使用如下通用方法,而不是逐个复制属性: http://www.codeproject.com/Articles/173664/Copy-Properties-From-One-Object-To-Another

答案 1 :(得分:0)

我可以让s1 = formatter.Deserialize(fs)正常工作。 s2 = formatter.Deserialize(fs)每次都会失败。

Serial required for deserialization表示您无法将对象A反序列化为对象B(Serial是关键字,指的是您的类名)。 MS二进制序列化程序要求您反序列化为序列化数据的同一class-culture-assembly对象。当MS序列化时,类文化汇编信息是二进制数据的一部分。有很多方法可以解决这个问题,例如编写序列化服务(比如在DLL中)和其他东西,但没有直接的方法。

如果您正在寻找一种数据交换序列化器,请查看ProtoBuf-NET。它既快于MS又产生了多个较小的输出(空字典从3000字节到300字节)。 PBN易于使用,允许您执行帖子文本(de-serialize it to a second class)描述的内容。实际上语法几乎相同。

修改

好的,我不确定在这种情况下'Serial'是指什么。我更改了类名并得到了相同的错误,因此它可能与使用Interfaces有关(这似乎是一种将反序列化为不同类型对象的方法)。当我试图在两种类型之间交换数据时,这条消息给了我一些类似“myclass-english blah blah blah-myassembly”的内容,不能反序列化为“myclass2-english-blah blah blah-otherassembly”。

<强> AHA!

在没有ISerializable的情况下将类更改为非常简单的类:

Public Class fromClass


Public Num1 As Integer
Public Num2 As Integer

Public Sub New()

End Sub

End Class

公共成员的工作方式与将其包含在属性getter / setter中相同(abd没有理由这不起作用)。现在,当您尝试反序列化为S2时,会出现一条新消息: Unable to cast object of type 'WindowsApplication1.fromClass' to type 'WindowsApplication1.toCLass'.

ISerializable掩盖了这个问题。你不能反序列化成其他东西。查看输出文件的文本 - 类文化汇编信息就在那里(并且是原始错误消息的来源)。我认为至少部分原因是反射被用于序列化;如果它不会回到同一个东西,它不会尝试(虽然它看起来像使用接口应该工作)。另一个原因可能是安全性。 PBN更灵活,更灵活,或多或少地围绕数据交换而设计。