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

标签 vb.net visual-studio-2010 serialization deserialization binaryformatter

我写了一个自定义类 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/

相关文章:

c# - C# ActionCommand :ICommand into VB.net 翻译

c# - javascript参数字符长度限制?

java - 为什么为继承而设计的类应该很少实现 Serializble 接口(interface)?

java - java.io.Serializable 类的意义是什么?

vb.net - VB控制PLC的应用

vb.net - 如何检查是否会引发事件?

vb.net - Microsoft Office PIA 以及如何从 WebApp 正确引用和构建

c++ - Webots Visual Studio 交叉编译

c# - vs2010/c#中的表命名空间错误

c# - 在字典中序列化 HashSet