2013-02-10 9 views
5

私はprotobuf-net(バージョン2.0.0.621)を使用しています。リストタイプを直列化する際に問題があります.Tは自分のクラスです(何が含まれていても問題ありません)私はMyClass型のインの一般的なリストを作成して次に<T> protobuf-net例外のサロゲートを使用して

public class MyClass 
{ 
    public int Number { get; set; } 
} 

[ProtoContract] 
MyClassSurrogate 
{ 
    [ProtoMember(1)] 
    public int Number { get; set; } 
} 

ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(MyClass), false).SetSurrogate(typeof(MyClassSurrogate)); 

MyClassのを:サロゲートは、サロゲートが、このように設定されているT.

のために設定されていますタンス、アイテムとそれを記入し、このようにそれをシリアル化:問題は、デシリアライゼーションで発生

ProtoBuf.Serializer.Serialize(stream, list); 

、私は暗黙のオペレータ変換における代理に「ヌル」を得続ける:

static public implicit operator MyClassSurrogate(MyClass myClass) 

し、「MyClassの' 無効である。

代理を削除してproto属性でMyClassを飾ると、すべて正常に動作します。

私が間違っていることを教えてもらえますか?

ありがとうございました。暗黙のオペレータへの変換はnullチェックを追加

+0

役に立たなかった場合はコメントを無視してください。ただ、プロトコルバッファを使用したことはありません。とにかく、質問はかなり基本的なようですが、これはあなたが正しい方向に向いていますか? http://stackoverflow.com/questions/6498438/protobuf-net-cannot-serialize-type-data-how-can-i-define-type-data-with-protoc – bas

答えて

5

問題を解決するよう、すなわち:

public static implicit operator MyClassSurrogate(MyClass myClass) 
{ 
    return myClass != null ? new MyClassSurrogate { Number = myClass.Number } : null; 
} 

暗黙の演算子は、最初は無視されるように表示される結果と一回のデシリアライズにNULL値を持つと呼ばれています。 MyClassSurrogateの

フル実装:

[ProtoContract] 
public class MyClassSurrogate 
{ 
    [ProtoMember(1)] 
    public int Number { get; set; } 

    public static implicit operator MyClassSurrogate(MyClass myClass) 
    { 
     return 
      myClass != null 
      ? new MyClassSurrogate { Number = myClass.Number } 
      : null; 
    } 

    public static implicit operator MyClass(MyClassSurrogate myClass) 
    { 
     return new MyClass { Number = myClass.Number }; 
    } 
} 

フルシリアライゼーション/デシリアライゼーション例:

1
var model = ProtoBuf.Meta.RuntimeTypeModel.Default; 
model.Add(typeof(MyClassSurrogate), true); 
model.Add(typeof(MyClass), false).SetSurrogate(typeof(MyClassSurrogate)); 
var stream = new System.IO.MemoryStream(); 
var list = new List<MyClass>(); 
for (int x = 0; x < 10; x++) list.Add(new MyClass { Number = x });    
ProtoBuf.Serializer.Serialize(stream, list); 
stream.Seek(0, SeekOrigin.Begin); 
var xs = ProtoBuf.Serializer.Deserialize<List<MyClass>>(stream); 
foreach (var x in xs) Debug.WriteLine(x.Number); 

値NULLをデシリアライズ中に含めて、かなり頻繁に使用されます。あなたは単にヌルとしてnullを変換するために変換演算子を伝えることで、この問題を解決することができるはずです。

if(value == null) return null; 

それについて考えて、私はおそらく安全「の両方が参照型である場合に、自動的にnullをnullとして変換する」を追加することができます。

関連する問題