c# - protobuf-net UseImplicitZeroDefaults 和 Enum 默认值

标签 c# serialization protocol-buffers protobuf-net

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

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

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

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

编辑:我使用了在以下位置找到的一些信息: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
    ...

最佳答案

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

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

关于c# - protobuf-net UseImplicitZeroDefaults 和 Enum 默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13887553/

相关文章:

serialization - AppFabric 缓存 - 我可以指定用于所有对象的序列化样式吗?

mysql - Wordpress 使用自定义查询搜索序列化元数据

java - 反序列化protobuf java数组

.net - 我如何在 .net 中使用 SSL 设置 grpc

c# - 使用 CompareTo 对具有两个参数的列表进行排序

c# - NUnit 构建错误 'Missing compiler required member System.Range.get_Start'

C# Simple 相当于 Enum 但具有多种数据类型?

c# - 层次结构数据的 LINQ 递归

java - Json动态反序列化与 jackson

go - 我应该如何使用 protoc-gen-go-grpc?