2011-02-02 12 views
3

を使用している間、私はクラスの下にあります。 -適切なデフォルトタイプエンコーディングが見つかりません。シリアル化がいるProtobuf

[Serializable] 
[DataContract(Name = "StateValueWrapper")] 
public class StateValueWrapper 
{ 
    [DataMember(Order = 1)] 
    public Type StateValueType { get; set; } 

    [DataMember(Order = 2)] 
    public object WrappedObj { get; set; } 
} 

私はエラーを取得protobuf.net.Whileのシリアライズを使用して上記のクラスのオブジェクトをシリアル化しようとしていますが、「いいえ、適切なデフォルト・タイプのエンコードが見つかりませんでした。」私はこのために何をする必要があるのか​​教えてください。以下はserilizationのための私のコードです: -

  MemoryStream ms = new MemoryStream(); 
      var srariazeObj = new StateValueWrapper(); 
      srariazeObj.StateValueType = typeof(int); 
      srariazeObj.WrappedObj = 5; 
      ProtoBuf.Serializer.NonGeneric.Serialize(ms, srariazeObj); 

答えて

1

TypeいるProtobufネット経由でシリアル化可能ではないではありません、どちらもobjectです。私はあなたがしようとしていることを理解しています。正直に言えば、が前もってタイプを知ることができません。オブジェクトのAssemblyQualifiedNamestring)とオブジェクトのbyte[]MemoryStream経由)をシリアル化することを検討する必要があります。後であなたが好きなら(私に教えてください)、私は事例を盛り上げることができます。しかし

有限をサポートする必要がある種類の失われた(例えば、「文字列をまたはint型またはお客様またはGUID のみ」)状態することが可能であるならば、はるかに効率的便利がありますアプローチ - これがあなたのシナリオであれば、もう一度例を挙げてみましょう。私に教えてください。

+0

はいMarc私はprotobufを使用してシリアライズするタイプの有限集合を持っています。あなたが最後の投稿で言ったアプローチを共有すると素晴らしいでしょう。 –

+0

@vivek - 私は既存の[非常によく似た例を見つけました。ここ](http://stackoverflow.com/questions/2678249/in-protobuf-net-how-can-i-pass-an-array-of-type-object-with-objects-of-different/2679154#2679154 ) –

1

今私が行ったことは、カスタムセッションプロバイダを作成し、それをStateValueWrapperオブジェクトに渡したことです。側では、serializeメソッドはまず、protobufを使用してStateValueWrapperのWrappedObjをシリアル化し、WrappedObjに割り当てます。バイナリシリアライザは、タイプ情報とバイト配列を含むStateValueWrapperオブジェクトをシリアル化します。デシリアライゼーションの最初のバイナリシリアライザは、SessionStateItemCollectionをデシリアライズして、型情報とバイト配列でStateValueWrapperを返します。次に、StateValueWrapperの型情報を使用してWrappedObjの逆シリアル化(protobuf)を実行しました。

関連する問題