【问题标题】:protobuf-net Constructor overriding deserialized valueprotobuf-net 构造函数覆盖反序列化值
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多