我正在序列化一个对象,当加载回来时,如果缺少一个字段,我想设置一个特定的值。例如,如果在版本2上添加了一个字段,则在加载由版本1生成的文件时,我想设置一个值。
示例:
<ProtoContract()>
Public Class Settings
' ... other members
<ProtoMember(33)>
Public AutoZoom As Boolean
'Load from a file
Friend Shared Function Load(filePath as string) As Settings
Dim result As Settings
Try
If IO.File.Exists(filePath) Then
Using s As New IO.FileStream(filePath, IO.FileMode.Open)
result = Serializer.Deserialize(Of Settings)(s)
End Using
Else
result = CreateNew()
End If
Catch ex As Exception
result = CreateNew()
End Try
Return result
End Function
Public Shared Function CreateNew() As Settings
Dim n = New Settings()
Return n
End Function
Private Sub New()
AutoZoom = TRUE
end sub
End Class
我尝试使用构造函数,认为它会在字段反序列化之前运行。但是,当从序列化文件加载对象时,某些字段将加载文件中的值,但是其他一些字段将保留构造函数设置的值,并且文件内的值将被忽略。 为什么会这样?
PO
答案 0 :(得分:0)
默认情况下(和&#34; proto3&#34;,但不是&#34; proto2&#34;),protobuf-net假定零(和假等)作为默认值(当成员是不可空,并且当没有检测到其他条件序列化API时,例如内置的public bool ShouldSerialize*()
模式)。听起来你通过构造函数有非零默认值,在这种情况下你需要做的就是通过属性[DefaultValue(...)]
告诉protobuf-net关于实际的默认值(在System.ComponentModel
中)。这也将使其他常见的.NET工具更加快乐,例如PropertyGrid
,PropertyDescriptor
等。
或者,禁用隐式零默认值功能(请参阅帖子上的注释)。然后,只会观察显式 [DefaultValue]
属性。