1

ここにも同様の質問があることは承知していますが、おそらく protobuf の経験が不足しているため、私が必要としているものほど直接的にこれを尋ねるものはありません。私は enyim のキャッシング クライアントのコード変換を行っていますが、派生クラスとインターフェイス実装の両方のクラスを正しくデシリアライズ/シリアル化する方法を理解するのに苦労しています。

こんなサンプルに

public class BaseClass
{
}

public interface ISomeRules
{
}

public class DerivedClass : BaseClass, ISomeRules
{
}

public class ThirdClass
{
    ISomeRules ruleUser;
}

私は通常どこでも属性を使用するので、私はこのようなことをしたいです

[ProtoContract
,ProtoInclude(101,typeof(DerivedClass))
]
public class BaseClass
{
}

[ProtoContract
,ProtoInclude(102,typeof(DerivedClass))
]
public interface ISomeRules
{
}

[ProtoContract]
public class DerivedClass : BaseClass, ISomeRules
{
}

[ProtoContract]
public class ThirdClass
{
    [ProtoMember(1)]
    ISomeRules ruleUser;
}

しかし、それは黙ってキャッシングに失敗します。一部の人が提案したように、ProtoContractから属性を削除するISomeRulesと、逆シリアル化は失敗します。

これはprotobuf-netを使用して実行できますか? これを行う正しい方法は何ですか?代わりに TypeModel (私はマスターしていませんが、簡単なテストで同じ問題があることを示しています) を使用する必要がありますか? それとも TypeModel と属性の組み合わせですか?

4

1 に答える 1

4

protobuf-netでのインターフェースのサポートは、限られたシナリオを対象としています。基本的に、特にネストされたメンバーのインターフェースベースのモデルに取り組んでいます。例えば:

[ProtoContract]
public class Foo {
    [ProtoMember(1)]
    public IBar Bar {get;set;}
}

上記では、をシリアル化できるようにしたいのですがBar、それについてはあまり知らないかもしれません。実際、がFoonull以外の値を返すことが保証されている場合Bar、protobuf-netは具象型などについて何も知る必要はありません。先に進んで、指定されたオブジェクトにデータを入力するだけです。

あなたの例では、ルートオブジェクトは間違いなくBaseClassです。ISomeRulesこれは補助的なものであり、モデルで言及する必要はまったくないことをお勧めします。ただし、を介してのみ公開されるメンバーにデータを入力する場合は、次のことを試してください(テストされていません)。ISomeRules

[ProtoMember(n)]
private ISomeRules Rules { get { return this; } }

これにより、情報が公開さISomeRulesれますが、サブオブジェクトとしてスプーフィングされます。少なくとも、試してみる価値はあります。p

于 2013-01-17T20:18:23.037 に答える