使用带有标志枚举的 ProtoBuf-Net 时出错

Posted

技术标签:

【中文标题】使用带有标志枚举的 ProtoBuf-Net 时出错【英文标题】:Error while using ProtoBuf-Net with flags enum 【发布时间】:2009-09-29 21:03:08 【问题描述】:

在使用 ProtoBuf-Net 并序列化枚举属性时,枚举设置为 [FlagsAttribute],我在序列化由多个标志组成的枚举值时收到以下错误消息。

错误是:值 (MyEnum.MyValue) 没有属性 MyProperty 的线表示

MyEnum 是:

[Flags]
public Enum MyEnum

    MyValue = 0,
    MyValue1 = 1,
    MyValue2 = 2,
    MyValue4 = 4,
    MyValue8 = 8,

MyProperty = MyEnum.MyValue2 | MyEnum.MyValue4;

似乎是 protobuf-net 中的错误?

【问题讨论】:

现在在 r274 中修复;查看更新的答案 【参考方案1】:

更新:这已在r274 中修复;你会使用:

[ProtoMember(12, DataFormat = DataFormat.TwosComplement)]
public MyEnum MyValue get;set;

最终协议缓冲区连接 格式不为 [Flags] 枚举提供任何范围 - 它对枚举值强制执行 谨慎的设置。我可以很容易地做到这一点,但是:

在这种情况下,我可能不得不禁用枚举映射,或者做很多丑陋的事情- 匹配工作 不会严格兼容

执行此操作的更简单方法可能是在您的代码中执行 shim:

public MyEnum MyValue get;set;
[ProtoMember(12)]
private int MyValueWire 
    get return (int)MyValue;
    set MyValue = (MyEnum)value;

另一种选择是在您的 代表;将其视为 int 而不是枚举。

【讨论】:

感谢您抽出宝贵时间回复。我更喜欢最后一种选择,我会在 ProtoMember 属性中放置一个标志以指示枚举应被视为 int。 非常感谢您的修复! 最好在枚举 ProtoContract 类本身中设置DataFormat @Gerard 请注意 [Flags] 多年来一直绕过验证,并且在 v3 中:所有枚举始终是 pass-thru

以上是关于使用带有标志枚举的 ProtoBuf-Net 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VB.NET 中使用 protobuf-net 添加枚举?

使用 protobuf-net 进行枚举序列化

打开枚举(带有标志属性)而不声明所有可能的组合?

Protobuf-net 使用嵌套数据反序列化时出现无效的线型异常(C++ 到 C#)

在便携式库上安装 protobuf-net 时出现 nuget 错误

带有标志属性的 Enum.TryParse