protobuf-net UseImplicitZeroDefaults和Enum默认值

时间:2012-12-14 23:14:36

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

我们正在尝试使用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; }

仍导致“无线值”错误。

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

仍导致“无线值”错误。

public enum SiteType
{
    Error = 0,
    ...

这很有效,但理想情况下我们希望保持清洁 也许是一种更简洁的方法来指定默认值:

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

1 个答案:

答案 0 :(得分:3)

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

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