思路
- 版本控制:在类中添加版本号字段,序列化时记录当前版本,反序列化时根据版本号采取不同策略。
- 可选字段处理:对于新增字段,在反序列化时设置默认值;对于删除字段,反序列化时忽略。
技术手段
- 添加版本号字段:在类中定义一个字段专门用于记录版本号。
- 自定义序列化/反序列化方法:通过实现
ISerializable
接口来自定义序列化和反序列化逻辑。
代码示例
Imports System
Imports System.IO
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
<Serializable()>
Public Class MyClass
Implements ISerializable
Private Const VersionNumber As Integer = 1
Private _field1 As String
Private _field2 As Integer
'新增字段示例
Private _newField As Double
Public Sub New()
'默认构造函数
End Sub
Public Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext) Implements ISerializable.GetObjectData
Dim version As Integer = info.GetInt32("Version")
_field1 = info.GetString("Field1")
_field2 = info.GetInt32("Field2")
If version >= 1 Then
_newField = info.GetDouble("NewField")
End If
End Sub
Public Sub GetObjectData(ByVal info As SerializationInfo, ByVal context As StreamingContext) Implements ISerializable.GetObjectData
info.AddValue("Version", VersionNumber)
info.AddValue("Field1", _field1)
info.AddValue("Field2", _field2)
info.AddValue("NewField", _newField)
End Sub
'示例方法
Public Sub SerializeObject(ByVal filePath As String)
Using stream As New FileStream(filePath, FileMode.Create)
Dim formatter As New BinaryFormatter()
formatter.Serialize(stream, Me)
End Using
End Sub
Public Shared Function DeserializeObject(ByVal filePath As String) As MyClass
Using stream As New FileStream(filePath, FileMode.Open)
Dim formatter As New BinaryFormatter()
Return CType(formatter.Deserialize(stream), MyClass)
End Using
End Function
End Class
使用示例
Module Module1
Sub Main()
'序列化对象
Dim obj As New MyClass()
obj._field1 = "Hello"
obj._field2 = 42
obj._newField = 3.14
obj.SerializeObject("test.bin")
'反序列化对象
Dim deserializedObj As MyClass = MyClass.DeserializeObject("test.bin")
Console.WriteLine($"Field1: {deserializedObj._field1}, Field2: {deserializedObj._field2}, NewField: {deserializedObj._newField}")
End Sub
End Module