Protocol buffers “什么是?”;没有导线值映射到enum 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这一事实意味着枚举的值

“未将导线值映射到枚举foo位置16”

这个错误消息是什么意思

  • i、 )导线值是多少

  • ii)相对位置是什么

在我的特殊情况下,我:

其他信息:未将导线值映射到位置16处的enum System.Drawing.ContentAlignment.0

枚举中没有整数0的表示形式,我知道。我认为,只要知道错误报告的含义,我就能更好地了解如何解决这个问题。

一个“wire value”是它将在“on the wire”(即在底层流中)使用的二进制表示形式。在这种情况下,它使用了
0
这一事实意味着枚举的值是0,但它不需要0,这很可能是因为没有定义值为0的枚举成员。如果有,它将使用名称,而不是
System.Drawing.ContentAlignment.0
。protobuf net正在尝试应用枚举规则,以强制执行有意义的值(还可以选择允许您定义枚举值和关联值之间的映射,对于某些具有外部数据的场景)

有多种方法可以避免此问题:

  • 不要尝试序列化不存在的枚举值(或者:如果控制枚举,请添加缺少的值)
  • 要表示缺少
    None
    值的枚举,请使用
    Nullable
    SomeEnum?
    )序列化该枚举
  • 使用将类型公开为
    int
    (或任何基础类型)的“shim”属性,以便protobuf net从不尝试应用枚举规则:

    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

  • [Flags]
    标记枚举声明,这将使protobuf net自动启用
    EnumPassThru
位置16可能是指输出缓冲区的偏移量;对于序列化,它可能比你对我帮助更多;对于反序列化,它可能对使用者更有用