2016-10-06 7 views
0
namespace MyNamespace            
{  

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

    [ProtoContract([email protected]"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の: 'MyNamespace.MyEnum' から '可能System.Int32' から無効なキャスト。いるProtobufネット:列挙型の変換エラー

+0

「ProtoBuf.Meta.RuntimeTypeModel.Default.AutoCompile = false;」を最初に設定した場合、これはまだ発生しますか?私はこれをフィドルで再現しようとしましたが、できませんでした:https://dotnetfiddle.net/YTaKDJを見てください。しかし、セキュリティ上の理由から、https://dotnetfiddle.netは 'Reflection.Emit()'をサポートしていないので、私は自動コンパイルを無効にしなければなりませんでした - そして、私はそのバグを再現できませんでした。 – dbc

答えて

0

私はprotobuf-net v2.1.0を使用していますが、アプローチによっては2つの異なるProtoExceptionが得られます。 No wire-value is mapped to the enum MyEnumまたはNo parameterless constructor foundです。理由は次のとおりです。デフォルトのint値0は、enum型の定数ではないか、パラメータコンストラクタでデフォルト値を割り当てられていません。 ECMA-334 C# Language Specification

  1. から

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

    又は

    public MyClass() { MyEnumProperty = MyEnum.EnumName1 } 
    

    明示的に基礎となる 型は、基礎となるた宣言しない列挙宣言:

    (論理和)回避策をintの型。 enumメンバがenum型で宣言された最初のenumメンバである場合、その関連付けられた値はゼロです。

  2. 列挙型は、実行時に、ランタイム 決定は

ので コンパイル時に知られている選択肢の固定数から作られた「複数選択」のシナリオ、のためにあなたの列挙型を使用していますあなたがコンパイル時の定数として定義していない値imoは、不正なenumです。

関連する問題