7

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

4 回答 4

1

您将需要控制序列化和反序列化过程。您可以使用ISerializable接口来执行此操作。

看一眼:

http://msdn.microsoft.com/en-us/library/ty01x675.aspx ,在“实现 ISerializable 接口”一节中有一些有用的信息。

于 2011-07-26T17:15:03.660 回答
1

过去,我在使用 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
于 2011-06-25T16:51:19.830 回答
0

添加和删​​除字段不应该有任何问题 - 我有经验证明,而不是我知道序列化如何详细工作。

更改私有属性的名称时可能会遇到问题。所有其他事情,甚至重新排序字段,你都很棒。

于 2011-05-10T13:38:55.580 回答
0

我还没有看过 BinaryFormatter.Deserialize() 的实际实现,所以我会推测。

我不认为反序列化器有责任确保一个类的所有属性都不为空。在很多情况下,null 属性都是完全有效的并且不会导致任何问题。

现在我可以回答你的问题了:

我相信向类添加属性不会导致问题,但是我确实认为删除您尝试反序列化的属性会导致错误。

于 2011-07-29T21:01:05.307 回答