我正在尝试序列化一个类,然后将其反序列化为第二个类,模仿类的结构的未来添加,所以我试图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
答案 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更灵活,更灵活,或多或少地围绕数据交换而设计。