2

protobuf-netを使用してクラスをシリアル化できません。問題は、protobuf-netがインターフェイスをシリアル化できないことのようです。

interface MyInterface
{
    string name;
}

[ProtoContract]
[ProtoInclude(1, typeof(MyClass1))]
[ProtoInclude(2, typeof(MyClass2))]
public abstract class ParentClass
{
    [ProtoMember(1)]
    List<MyInterface> elements;
}


[ProtoContract]
public class MyClass1 : ParentClass, MyInterface
{
    [ProtoMember(1)]
    int x;
}

[ProtoContract]
public class MyClass2 : MyInterface
{
    [ProtoMember(1)]
    string y;
}

要素はインターフェイスのリストであり、Mylass1またはMyClass2である可能性があるため、タイプMyClass1のオブジェクトをシリアル化できません。エンコードが設定されていないというエラーが発生します。

誰かが私にこれを解決する方法を教えてもらえますか?ありがとう。

4

2 に答える 2

1

現在の公式バージョンでは、インターフェイスのシリアル化のサポートは含まれていません。ただし、これを可能にするように見えるパッチが(別のユーザーから)提供されています。

このパッチはまだコアに適用していません。機能を追加する前に最初に「v2」を終了することに集中する必要があるためです(特に、機能をv2に完全に再実装する必要があるため)が、満足しています。必要に応じてパッチを共有します。

または、インターフェイスの代わりに基本クラスを使用します。それ(を介して)サポートされてい[ProtoInclude]ます-しかし、あなたMyClass1がすでに親クラスを持っているという事実は、いくぶん問題を複雑にします。


編集:これはv2でサポートされるようになりました。コードは、予想される具体的な実装について知っている必要がありますが、インクルードをインターフェイスにアタッチできるようになりました(または、オプションでバニラPOCOモデルのコードで指定できます)。

于 2010-09-24T09:47:57.187 に答える
0

私の推測では、次を追加する必要があります。

[ProtoInclude(1, typeof(MyClass1))]
[ProtoInclude(2, typeof(MyClass2))]

MyClass1あなたとあなたの両方にMyClass2継承しMyInterface、シリアル化はタイプを知りません。

于 2010-09-24T01:53:30.270 に答える