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