2011-07-31 20 views
7

(注意:DictionaryはどこのProtoContract/ProtoMemberedクラスでもうまく動作します)この問題は、typeオブジェクトの場合にのみ発生します。Dictionary <string、object>をProtoBuf-netでシリアライズすると失敗する

辞書の辞書をシリアル化しようとしていました。

typeof(オブジェクト)が機能しません。すべき?私は文字列ベースの回避策を実装する必要がありますか?

このシナリオでは、オブジェクトは.netプリミティブにしかなりません。

[Test] 
    public void De_SerializeObjectDictionary2() 
    { 
     var d = new Dictionary<string, object>(); 

     d.Add("abc", 12); 

     var ms = new MemoryStream(); 

     var model = ProtoBuf.Meta.RuntimeTypeModel.Default; 
     //model.AutoAddMissingTypes = true; 
     //model.AutoCompile = true; 
     //model.InferTagFromNameDefault = true; 
     //model.Add(typeof (object), false); 
     //model.Add(typeof(Int32), true); 
     //model[typeof (object)].AddSubType(50, typeof (Int32)); 

     model.Serialize(ms, d); 
     Serializer.Serialize<Dictionary<string,object>>(ms, d); 
     // <--- No serializer defined for type: System.Object 

     // or 
     //model.Add(typeof (object), false); 
     //Serializer.Serialize<Dictionary<string, object>>(ms, d); 
     //<-- Unexpected sub-type: System.Int32 
     ms.Position = 0; 

     var d2 = Serializer.Deserialize<Dictionary<string, object>>(ms); 
    } 

私は先に時間のこれらのタイプを定義しようとしました...しかし、私は、彼らがこれを行うための欲求は、直接、既に持っているProtobufネット

 //model.Add(typeof (object), false); 
     //model[typeof (object)].AddSubType(50, typeof (Int32)); 
     /* 
     //model.Add(typeof(int), false); 
     //model.Add(typeof(string), false); 
     //model.Add(typeof(short), false); 
     //model.Add(typeof(DateTime), false); 
     //model.Add(typeof(long), false); 
     //model.Add(typeof(bool), false); 
     //model.Add(typeof(int[]), false); 
     //model.Add(typeof(string[]), false); 
     //model.Add(typeof(short[]), false); 
     //model.Add(typeof(DateTime[]), false); 
     //model.Add(typeof(long[]), false); 
     //model.Add(typeof(bool[]), false); 

     //model.Add(typeof(int?), false); 
     //model.Add(typeof(short?), false); 
     //model.Add(typeof(DateTime?), false); 
     //model.Add(typeof(long?), false); 
     //model.Add(typeof(bool?), false); 
     //model.Add(typeof(int?[]), false); 
     //model.Add(typeof(short?[]), false); 
     //model.Add(typeof(DateTime?[]), false); 
     //model.Add(typeof(long?[]), false); 
     //model.Add(typeof(bool?[]), false); 

     //model.Add(typeof(byte[]), false); 
     //model.Add(typeof(byte), false); 
+0

あなたは時間のすべての可能性のあるタイプを知っていますか?ここにはいくつの種類がありますか? –

+0

はすべて、辞書のシリアライズ可能な型ですか? –

+0

はい。ここに私が試みた主義があります。それらはすべてエラーを引き起こします。彼らはすでにProtobuf-netライブラリによって定義されていると思います。 – sgtz

答えて

4

により、デフォルトで取り扱わいると思います私のリストに載っていますが、inbuilt serialization(intなど)を継承の一部として扱うタイプには、あまり面白くないいくつかの技術的な問題があります。私の推奨するのは、汎用の具象実装で抽象基本クラスを使用し、実行時に予想される型のそれぞれを引用するためにbase-typeに "include"属性を使用することです.DynamicTypeはここでも考慮されますが、,Foo<string>などです。私はこれが辞書のために直ちに動作するとは思わない。しかし、それはできます。

+0

+1タイ。はい。それは正常に動作します。提案していただきありがとうございます。 – sgtz

関連する問題