【问题标题】:protobuf-net : enum type conversion errorprotobuf-net:枚举类型转换错误
【发布时间】:2016-10-06 22:13:15
【问题描述】:
namespace MyNamespace                                               
{       

    public enum MyEnum
    {
        EnumName1 = 1,    
        EnumName2 = 2,
        ...

    [ProtoContract(Name=@"MyClassProto")]                                               
    [Serializable]                                                                                  
    public class MyClass : IExtensible                                              
    {                                                                                                                                           
        [ProtoMember(1, IsRequired = false, Name = @"MyEnumProperty", DataFormat = ProtoBuf.DataFormat.Default)]
        [System.ComponentModel.DefaultValue(1)]                                                     
        public MyEnum MyEnumProperty;                               
        ...



  var myObjectIn = new MyClass
  {
      MyEnumProperty = MyEnum.EnumName1,
      ...
  };

  MyClass myObjectOut;
  using (var stream = new MemoryStream())
  {
      ProtoBuf.Serializer.Serialize(stream, myObjectIn);
      stream.Seek(0, SeekOrigin.Begin);
      myObjectOut = ProtoBuf.Serializer.Deserialize<MyClass>(stream);
  }

System.InvalidCastException : 从 'System.Int32' 到的无效转换 'MyNamespace.MyEnum'。

【问题讨论】:

  • 出于好奇,如果您最初设置ProtoBuf.Meta.RuntimeTypeModel.Default.AutoCompile = false;,还会出现这种情况吗?我试图在小提琴中重现这一点,但不能:见dotnetfiddle.net/YTaKDJ。但是,出于安全原因,dotnetfiddle.net 不支持Reflection.Emit(),所以我不得不禁用自动编译 - 当我这样做时,错误无法重现。

标签: c# serialization enums protocol-buffers protobuf-net


【解决方案1】:

我正在使用 protobuf-net v2.1.0,根据方法我得到两个不同的ProtoExceptions。 No wire-value is mapped to the enum MyEnumNo parameterless constructor found。原因是:默认 int 值 0 在您的枚举类型中不是常量,或者您没有在参数构造函数中为其分配默认值。

解决方法(逻辑或):

public enum MyEnum { EnumName1 = 1, EnumName2 = 2, @default = 0 }

public MyClass() { MyEnumProperty = MyEnum.EnumName1 }

来自ECMA-334 C# Language Specification

  1. 未显式声明底层的枚举声明 type 有一个基础类型 int。如果枚举成员是枚举类型中声明的第一个枚举成员,则其关联值为零。
  2. 枚举用于“多选”场景,其中运行时 决定是从已知的固定数量的选择中做出的 编译时

因此,您未将运行时值定义为编译时常量 imo 的枚举是一个错误的枚举。

【讨论】:

    猜你喜欢
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多