protobuf-net构造函数重写反序列化的值

时间:2017-07-10 23:03:47

标签: .net vb.net protobuf-net

我正在序列化一个对象,当加载回来时,如果缺少一个字段,我想设置一个特定的值。例如,如果在版本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

1 个答案:

答案 0 :(得分:0)

默认情况下(和&#34; proto3&#34;,但不是&#34; proto2&#34;),protobuf-net假定零(和假等)作为默认值(当成员是不可空,并且当没有检测到其他条件序列化API时,例如内置的public bool ShouldSerialize*()模式)。听起来你通过构造函数有非零默认值,在这种情况下你需要做的就是通过属性[DefaultValue(...)]告诉protobuf-net关于实际的默认值(在System.ComponentModel中)。这也将使其他常见的.NET工具更加快乐,例如PropertyGridPropertyDescriptor等。

或者,禁用隐式零默认值功能(请参阅帖子上的注释)。然后,只会观察显式 [DefaultValue]属性。