Protocol buffers “什么是?”;没有导线值映射到enum foo位置16“;误差平均值?
“未将导线值映射到枚举foo位置16” 这个错误消息是什么意思Protocol buffers “什么是?”;没有导线值映射到enum foo位置16“;误差平均值?,protocol-buffers,protobuf-net,Protocol Buffers,Protobuf Net,“未将导线值映射到枚举foo位置16” 这个错误消息是什么意思 i、 )导线值是多少 ii)相对位置是什么 在我的特殊情况下,我: 其他信息:未将导线值映射到位置16处的enum System.Drawing.ContentAlignment.0 枚举中没有整数0的表示形式,我知道。我认为,只要知道错误报告的含义,我就能更好地了解如何解决这个问题。一个“wire value”是它将在“on the wire”(即在底层流中)使用的二进制表示形式。在这种情况下,它使用了0这一事实意味着枚举的值
- i、 )导线值是多少
- ii)相对位置是什么
0
这一事实意味着枚举的值是0,但它不需要0,这很可能是因为没有定义值为0的枚举成员。如果有,它将使用名称,而不是System.Drawing.ContentAlignment.0
。protobuf net正在尝试应用枚举规则,以强制执行有意义的值(还可以选择允许您定义枚举值和关联值之间的映射,对于某些具有外部数据的场景)
有多种方法可以避免此问题:
- 不要尝试序列化不存在的枚举值(或者:如果控制枚举,请添加缺少的值)
- 要表示缺少
值的枚举,请使用None
(Nullable
)序列化该枚举SomeEnum?
- 使用将类型公开为
(或任何基础类型)的“shim”属性,以便protobuf net从不尝试应用枚举规则:int
public SomeEnum Foo {get;set;} // the actual member [ProtoMember(42)] private int FooSerialized { // only exists to help protobuf-net ignore the get { return (int)Foo; }// invalid values that the member might contain set { Foo = (SomeEnum)value; } }
- 通过
手动配置模型,并通过将RuntimeTypeModel
设置为EnumPassthru
true
- 用
标记枚举声明,这将使protobuf net自动启用[Flags]
EnumPassThru