我们目前有一个客户端-服务器应用程序,该应用程序使用许多protobuf-net序列化类来方便地传递数据对象。
从本质上讲,此应用程序仅将数据从基础数据库传入和传给我们的客户端,并处理身份验证和缓存。
我们用protobuf-net装饰的类非常简单,但是有些还包含枚举类型。
由于版本更新并不总是完全向所有客户端推出,有时我们会得到
“没有线值映射到枚举xxx”
错误。当数据库中的整数被强制转换为枚举类型(在纯c#中可以,但会导致protobuf-net异常)时,也会发生此错误。
在这种情况下,我们通过Protocontract(EnumPassthru = true)
添加了EnumPassthru选项。
现在,我了解,如果没有在服务器端实际使用数据对象,而是将其转换为适当的整数客户端,我们可以将数据对象设计为整数/长整数,而不是实际的枚举类型。
为了更好地决定我们应该做什么,我想知道是否有理由不仅仅使用EnumPassthru=true
选项声明所有protobuf序列化的类,这也更好地反映了C#的默认行为。
在进行"replace all [ProtoContract()] ==> [Protocontract(EnumPassthru = true)]"
时有什么注意事项吗?我已经尝试过此操作,但在与未启用此设置的较早版本进行通信时未发现任何问题。
答案 0 :(得分:1)
不,没有;我实际上完全赞同这样做。
基本上,这取决于Google更改规格。最初,对于意外的枚举值导致输入被拒绝是“正确的”。但是,由于“ proto3”时间(过去几年)中的某个时刻,他们推翻了决定,并决定应默默地接受意外的枚举值(至少在使用“ proto3”时)。>
所以;最新的protobuf-net版本(大约一年?)现在默认使用“枚举通过”方法。较旧的protobuf-net版本:不。如果出于某种原因混合使用多种库版本,那么将“枚举通过”放在任何地方都是非常实用和实用的解决方案。
还要注意,[Flags]
枚举也始终被视为直通。
在另一种情况下,默认情况下,新版本的protobuf-net 不使用直通;如果您有类似的东西:
public enum Foo {
A,
[ProtoEnum(Value=42)]
B,
C,
}
在这里不能使用pass-thru,因为它需要手动将代码中的B
(值1
)重新映射到网上的42