【发布时间】:2017-07-10 23:03:46
【问题描述】:
我正在序列化一个对象,并且在加载回时,如果缺少某个字段,我想设置一个特定值。比如版本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
【问题讨论】:
-
混淆值是否为零?含义:构造函数将它们设置为非零,您将它们序列化为零,并将它们反序列化为非零?如果是这样:缺少 [DefaultValue(...)]。或者,禁用隐式零默认值 (RuntimeTypeModel.UseImplicitZeroDefaults)。对于其他任何事情,我都需要查看某种代码。
-
混淆值实际上是布尔值。构造函数中的字段设置为 TRUE。当我知道它被保存为 FALSE 进行反序列化时,生成的反序列化对象的字段设置为 TRUE。
-
为此,false === 零。
-
抱歉,我确实错过了那个细节......我发誓我读了 100 次这个默认的 Zeros 问题,我总是读到问题是再次恢复 FALSE。谢谢!
-
我怀疑
[DefaultValue(true)](在 VB 语法中)会解决你的问题
标签: .net vb.net protobuf-net