C# 是否有理由不声明EnumPassthru=true的所有protobuf net ProtoContract属性类

C# 是否有理由不声明EnumPassthru=true的所有protobuf net ProtoContract属性类,c#,protobuf-net,C#,Protobuf Net,我们目前有一个客户机-服务器应用程序,它使用许多protobuf net序列化类来方便地通信数据对象 本质上,这个应用程序只是将数据从底层数据库代理给我们的客户机,并处理身份验证和缓存 我们的protobuf网络修饰类非常简单,但有些类还包含枚举类型 由于版本更新并不总是完全适用于所有客户机,因此我们有时会得到 “未将导线值映射到枚举xxx” 错误。当数据库中的整数被强制转换为枚举类型时,也会发生此错误,这在纯c#中是可以的,但会导致protobuf net异常 在出现这种情况的情况下,我们通过

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

本质上,这个应用程序只是将数据从底层数据库代理给我们的客户机,并处理身份验证和缓存

我们的protobuf网络修饰类非常简单,但有些类还包含枚举类型

由于版本更新并不总是完全适用于所有客户机,因此我们有时会得到

“未将导线值映射到枚举xxx”

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

在出现这种情况的情况下,我们通过
协议(EnumPassthru=true)
添加了EnumPassthru选项

现在我明白了,如果数据对象没有在服务器端实际使用,并将其强制转换到适当的整数客户端,那么我们可以将其设计为整数/长型,而不是实际的枚举类型

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


执行
“替换所有[ProtoContract()]==>[ProtoContract(EnumPassthru=true)]”时是否有任何注意事项?我已尝试过此设置,但在与未启用此设置的旧版本通信时未发现任何问题。

否,无;事实上,我完全赞成这样做

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

所以,;最近的protobuf网络版本(大约一年?)现在默认使用“enum passthru”方法。旧的protobuf网络版本:不要。如果出于任何原因混合使用库版本,那么将“enum passthru”放在任何地方都是一个非常实用的解决方案

还要注意,
[Flags]
枚举也始终被视为传递

还有一个场景,protobuf net的新构建默认情况下不使用传递;如果您有以下情况:

public enum Foo {
    A,
    [ProtoEnum(Value=42)]
    B,
    C,
}
它不能在此处使用pass-thru,因为它需要手动将代码中的
B
(值为
1
)重新映射到导线上的
42