2013-05-09 21 views
7

私はProtobuf-netを使ってカスタムネストされたリストをシリアル化しています。ネイティブリストを直接ネストすることはできないことを理解しています。そのため、内側のリストにコンテナオブジェクトを使用しています。しかし、私はまた私のコンテナはIEnumerableをオブジェクトをしたいと思いますが、これはいるProtobufネットがエラーでそれを投げる意味:ここでProtobuf-net:ネストされたIEnumerableオブジェクト

Nested or jagged lists and arrays are not supported

はエラーが発生私のリスト構造の例である:

[ProtoContract] 
public class MyOuterList<T> 
{ 
    [ProtoMember(1)] 
    readonly List<MyInnerList<T>> nestedData = new List<ObjectList<T>>(); 
} 

[ProtoContract] 
public class MyInnerList<T> : IEnumerable<T> 
{ 
    [ProtoMember(1)] 
    private readonly List<T> data = new List<T>(); 
} 

修正プログラムはIEnumerableをMyInnerListから削除しますが、明らかに直接反復可能であることはありません。使用することができる[ProtobufCustomObjectSoPleaseIgnoreIEnumerable]のような卑劣な属性はありますか?

私が今まで考え出してきた最良の選択肢は、以下に示すようにEnumerableプロパティを使用することですが、プロパティがまだリストに再びキャストされる可能性があることを恐れています。私はGetEnumerator/yield何らかの形で使用することを好むだろうが、私はどのように見ることができません。

[ProtoContract] 
public class MyInnerList<T> 
{ 
    [ProtoMember(1)] 
    private readonly List<T> data = new List<T>(); 

    public IEnumerable<T> Data 
    { 
     get { return this.data; } 
    } 
} 

答えて

8

Is there a sneaky attribute like [ProtobufCustomObjectSoPleaseIgnoreIEnumerable] that could be used?

うん:

[ProtoContract(IgnoreListHandling=true)] 
public class MyInnerList<T> : IEnumerable<T> 
{ 
    [ProtoMember(1)] 
    private readonly List<T> data = new List<T>(); 
} 

卑劣な卑劣です。 IgnoreListHandlingはインテリセンスのドキュメントがあります。また

If specified, do NOT treat this type as a list, even if it looks like one.

、複数の要求like this oneが原因を、私はすぐにギザギザの配列/リストのサポートを実装を見に計画しています。基本的に、シリアライザの想像上のメンバー(フィールド1)を使ってラッパーをスプーフィングするようにランタイムを設定するので、List<List<T>>を使用することができます。これはあなたのモデルのように動作します(ワイヤー互換性もあります。賢明にはフィールド1を選択してください)。

+0

完璧、多くのおかげです。私はどこを見ているべきかわからなかった。 –

+0

この問題を解決するにはまだ問題があります。問題はここに投稿されています:https://code.google.com/p/protobuf-net/issues/detail?id=287&q=IgnoreListHandling –

+0

@shakinfree k; –

関連する問題