gpt4 book ai didi

vb.net - 当基础类略有更改时,我可以反序列化对象吗?

转载 作者:行者123 更新时间:2023-12-04 12:49:38 26 4
gpt4 key购买 nike

我写了一个自定义类 MyClass并用 <Serializable()> 标记它属性。我的硬盘驱动器上有一组二进制文件,我使用 BinaryFormatter 序列化了这些文件。来自 MyClass 的实例.

我最近改变了 MyClass 的结构稍微(添加了一些属性,删除了一些属性,更改了一些方法等)。

当我尝试使用下面的代码将现有对象反序列化为这个更改后的类时会发生什么? 我已经试过了,没有抛出错误或任何东西 - 但是当类发生变化时它肯定无法正确反序列化吗?即使我已经更新了类,有没有办法可以从序列化文件中获取一些有用的信息?

谢谢。

这是我用来进行序列化的代码:

Public Sub serializeObject(ByVal obj As Object, ByVal outFilename As String)
Dim fStream As FileStream
Try
fStream = New FileStream(outFilename, FileMode.Create)
Dim bfmtr As New BinaryFormatter
bfmtr.Serialize(fStream, obj)
fStream.Close()
Catch ex As Exception
MsgBox("Failed to serialize: " & ex.Message)
Throw
End Try
End Sub

并执行我正在使用的反序列化:
myObj = CType(deserializeObject("C:\myobject.bin"), MyClass))

哪里 deserializeObject是:
Public Function deserializeObject(ByVal srcFilename As String) As Object
If File.Exists(srcFilename) Then
Dim fStream As Stream = File.OpenRead(srcFilename)
Dim deserializer As New BinaryFormatter
Dim returnObject As Object = deserializer.Deserialize(fStream)
fStream.Close()
Return returnObject
Else
Throw New ApplicationException("File not found: " & srcFilename)
End If
End Function

最佳答案

过去,我在使用 binaryformatter 的序列化对象中的微小更改之间遇到了兼容性问题,我也不完全理解为什么。有一个“UnsafeDeserialize”方法,它暗示了一个更兼容的“反序列化”。

“发生了什么”是当它确实具有破坏兼容性的更改时,您根本无法重新创建对象。我不知道是否有任何方法可以在不使用旧代码结构的情况下再次重新创建它。

我在这些情况下使用了 XML 序列化,这似乎更安全(并且是可读的,因此您可以潜在地纠正以后遇到的任何问题)

代价是在大多数情况下,XML 序列化对象的大小要大得多。压缩/解压缩可以帮助解决这个问题。

这是我为此使用的 XML 例程。

''' <summary>
''' Serializes as object into XML format
''' This IS different then SOAP Serialization.
''' </summary>
''' <typeparam name="ObjectType">The type of the object being serialized</typeparam>
''' <param name="oObj">The object to serialize</param>
''' <returns>The XML Document (string) that is the serialized object in text form</returns>
Public Shared Function XmlSerialize(Of ObjectType)(ByVal oObj As Object) As String
Dim sb As New System.Text.StringBuilder
Dim sw As New IO.StringWriter(sb)
Dim x As New System.Xml.Serialization.XmlSerializer(GetType(ObjectType))
x.Serialize(sw, oObj)
Return sb.ToString
End Function
''' <summary>
''' DeSerializes and object from an XML Document
''' This IS different then SOAP Serialization.
''' </summary>
''' <typeparam name="ObjectType">The Object type that will be returned (That the XML Data is derived from)</typeparam>
''' <param name="oObj">The Object (in it's XML Document serialized format)</param>
''' <returns>The new object</returns>
Public Shared Function XmlDeSerialize(Of ObjectType)(ByVal oObj As String) As ObjectType
Dim sr As New IO.StringReader(oObj)
Dim x As New System.Xml.Serialization.XmlSerializer(GetType(ObjectType))
Dim out As ObjectType = CType(x.Deserialize(sr), ObjectType)
Return out
End Function

关于vb.net - 当基础类略有更改时,我可以反序列化对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5949454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com