【问题标题】:protobuf-net UseImplicitZeroDefaults and Enum defaultsprotobuf-net UseImplicitZeroDefaults 和 Enum 默认值
【发布时间】:2012-12-14 23:14:35
【问题描述】:

我们正在尝试使用 protobuf-net,但无法理解现在在自定义 RuntimeTypeModel 中禁用的 UseImplicitZeroDefaults。我们最初使用默认的 RuntimeTypeModel,但注意到布尔属性没有被克隆,即使指定了 DefaultValue,即 DefaultValue=true,但当设置为 false 时,克隆的属性将始终为 true。

我们通过创建自定义 RuntimeTypeModel 解决了这个问题,它允许我们将 UseImplicitZeroDefaults 设置为 false。但是将此设置为 false 会导致以下错误;

ProtoBuf.ProtoException: No wire-value is mapped to the enum

请注意,我们的一些枚举不是基于零的,这会导致问题吗?我们如何克隆/序列化布尔属性和枚举(非零和基于零的混合)?

编辑:我使用了在protobuf-net enum serialization 找到的一些信息并且可以报告:

[ProtoMember(10), DefaultValue(SiteType.Partition)]
public SiteType Type { get; set; }

仍然导致“No wire-value”错误。

[ProtoMember(10, IsRequired = true)]
public SiteType Type { get; set; }

仍然导致“No wire-value”错误。

public enum SiteType
{
    Error = 0,
    ...

这可行,但理想情况下我们希望让我们的枚举保持干净。
也许是一种指定默认值的更简洁的方法:

[DefaultValue(SiteType.Server)]
public enum SiteType
{
    Server = 1,
    Monkey = 2
    ...

【问题讨论】:

  • 我得看看——今晚太晚了;但是:如果设置 IsRequired=true 是否有效?
  • IsRequired 在属性级别设置,但是为了避免我们使用 [ProtoContract(ImplicitFields = ImplicitFields.AllPublic)] 的类的过度装饰。所以我们没有在属性级别设置任何东西,也许我们应该这样做!
  • 我会调查一下,看看这里有没有问题
  • Marc,我更新了我的问题以反映一些测试的结果。期待您的反馈。
  • Marc,补充一下,我能够解决此问题,但在要序列化的类对象的构造函数中设置默认枚举值。这解决了问题,避免了我们必须在 enum 属性上使用 protobuf-net 属性。

标签: c# serialization protocol-buffers protobuf-net


【解决方案1】:

我们通过为任何基于非零的枚举指定默认枚举来解决此问题。我们在被序列化的类的构造函数中指定了默认值。这是迄今为止最整洁的解决方案,不需要任何额外的 protobuf-net 属性。

另外,为基于非零的枚举属性显式设置默认值是有意义的。

【讨论】:

  • 感谢更新;我仍然会调查,但是:圣诞节等事情会变得很忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多