8

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

ネストされたまたはギザギザのリストと配列はサポートされていません

エラーの原因となるリスト構造の例を次に示します。

[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; }
    }
}
4

1 に答える 1

8

そのような卑劣な属性は[ProtobufCustomObjectSoPleaseIgnoreIEnumerable]使用できますか?

うん:

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

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

指定されている場合、このタイプをリストとして扱わないでください。たとえリストのように見えても。

また、このような複数のリクエストがあるため、ギザギザ配列/リストのサポートの実装をまもなく検討する予定です。計画は基本的に、ランタイムがシリアライザーの想像でメンバー (フィールド 1) を使用してラッパーを偽装するようにすることです。そのため、List<List<T>>上記のモデルと同じように使用でき、動作します (ワイヤ互換性さえあります。フィールドを選択1)。

于 2013-05-09T10:09:02.570 に答える