是否有理由不使用 EnumPassthru=true 声明所有 protobuf-net ProtoContract 属性 类

Is there a reason not to declare all protobuf-net ProtoContract attribute classes with EnumPassthru=true

我们目前有一个客户端-服务器应用程序,它使用许多 protobuf-net 序列化 类 来方便地传递数据对象。

本质上,此应用程序只是将数据从底层数据库代理到我们的客户端,同时处理身份验证和缓存。

我们的protobuf-net装饰类很简单,但有些还包含枚举类型。

由于版本更新并不总是完全向所有客户端推出,我们有时会收到

"No wire-value is mapped to the enum xxx"

错误。当数据库中的整数被转换为枚举类型时也会发生此错误,这在纯 c# 中很好,但会导致 protobuf-net 异常。

在发生这种情况的情况下,我们通过 Protocontract(EnumPassthru = true) 添加了 EnumPassthru 选项。

现在我知道我们可以将数据对象设计为 integers/longs 而不是实际的枚举类型,如果它们实际上没有在服务器端使用并将它们转换为正确的整数客户端。

为了更好地决定我们应该做什么,我想知道是否有任何理由不使用 EnumPassthru=true 选项声明所有 protobuf-serialized 类,这也更好地反映了 C# 的默认行为。

"replace all [ProtoContract()] ==> [Protocontract(EnumPassthru = true)]" 有什么注意事项吗?我已经试过了,没有发现与未启用此设置的旧版本通信时的任何问题。

没有,none;我实际上完全赞成这样做。

基本上,归结为 google 更改规范。最初,"correct" 意外的枚举值导致输入被拒绝。但是,由于 "proto3" 时间(最近几年)的某个时间点,他们改变了他们的决定并决定意外的枚举值应该 默默地接受 (至少在使用 "proto3").

所以;最近的 protobuf-net 版本(大约一年?)现在默认使用 "enum passthru" 方法。旧的 protobuf-net 版本:不要。如果您出于某种原因混合使用多个库版本,将 "enum passthru" 放在各处是一个非常务实且实用的解决方案。

另请注意,[Flags] 枚举也一直被视为传递。

还有一种情况是新构建的 protobuf-net 默认使用 pass-thru;如果你有类似的东西:

public enum Foo {
    A,
    [ProtoEnum(Value=42)]
    B,
    C,
}

它不能在这里使用 pass-thru,因为它需要手动将代码中的 B(值为 1)重新映射到线路上的 42[=15] =]