2

Protobuf-net で List< T > から派生したオブジェクトをシリアル化する方法がわかりません。ProtoInclude 属性を追加しようとしましたが、ProtoBuf.ProtoException を受け取りました: ProtoIncludeAttribute の Known-type List`1 は、 UserTypeCollection の直接のサブクラスでなければなりません。ProtoInclude 属性を削除すると、データがまったくシリアル化されていないように見えます。このような状況の例はどこにも見つからないようです。WS API のオプションとして protobuf シリアル化を追加しており、DataContractSerializer との互換性を維持する必要があります。

[CollectionDataContract(), ProtoContract(InferTagFromName = true)]
[ProtoInclude(100, typeof(List<UserType>))]
public class UserTypeCollection : List<UserType>
{ ... }

[DataContract(), ProtoContract(InferTagFromName = true)]
public class UserType { ... }
4

1 に答える 1

3

ProtoInclude基本型ではなく、サブ型を示すために使用されます (結局、基本型は既に知られています)。また、IList<T>処理ほとんど暗黙的に行う必要があります。リストは含まれているアイテムの単なるシーケンスであるため、リストの場合、「推論...」などはほとんど機能しないことに注意してください。

以下では、リストを (最上位のオブジェクトとして)シリアル化しようとしていると想定しています。

現時点では適切なマシンを使用していませんが、リリースされた dll では、オブジェクトを介してリストをラップすると機能することが期待されます。

[DataContract]
public class Foo {
    private readonly UserTypeCollection items = new UserTypeCollection();
    [DataMember(Order=1)]
    public UserTypeCollection Items {get{return items;}}
}

「v2」では、このシナリオが最初から機能することを願っています。明日(適切なマシンを手に入れたら)これをテストしてみます。

もう1つの考え。どのメソッドも仮想化されていないため、通常、サブクラス化List<T>はあまり役に立ちません。もちろん、あなた次第です。最後に、「v2」では、型自体に影響を与えずにシリアライゼーションをより詳細に制御したい場合に、モデルを外部に記述することができます。

于 2010-08-06T21:52:11.773 に答える