1

私の質問はこの質問と非常に似ていると思います: Protobuf-net はインターフェイスと抽象基底クラスを使用して型モデルを作成します が、ここで Marc が提供する解決策は、本質的に抽象クラスとインターフェイスの多重継承を単一の継承設計に減らします。

私にとっての問題は、実際には次のような複数のインターフェイス継承が必要なことです。

interface ITestBase 
{
}
abstract class TestBase : ITestBase 
{
}
class TestTypeA : TestBase, ITestTypeA 
{
}
interface ITestTypeA 
{
}
class TestTypeB : TestBase, ITestTypeB 
{
}
interface ITestTypeB 
{
}

ここで、具体的なクラス TestTypeA は ITestTypeA と ITestBase の両方を実装する必要があり、TestTypeB は ITestTypeB と ITestBase を実装する必要があるため、TestBase に ITestTypeA または ITestTypeB を実装することによってこれを矮小化することはできません (他の質問の解決策と同様)。

そして、私はprotobuf-net v2.0.0.480を使用しています

4

1 に答える 1

1

この実行可能な解決策を見つけました。推奨されているのか、実行時に無意識のうちに壊れてしまうのかはわかりませんが、これまでのテストではうまくいくようです。

protobuf-net はインターフェースをシリアライゼーションの具象クラスのように扱うため、複数の継承の問題が発生するため (これは私が理解していることです)、1 つの基本クラスから継承するだけで、クラスとそのインターフェースの関係を指定しません。

そして、以下のようにクラス階層を定義するために使用できる具体的な基本クラスを作成します。

[ProtoContract]
interface ITestBase 
{
}

[ProtoContract]
[ProtoInclude(1, typeof(TestTypeA))]
[ProtoInclude(2, typeof(TestTypeB))]
abstract class TestBase : ITestBase
{
}

[ProtoContract]
class TestTypeA : TestBase, ITestTypeA 
{
}

[ProtoContract]
interface ITestTypeA 
{
}

[ProtoContract]
class TestTypeB : TestBase, ITestTypeB 
{
}

[ProtoContract]
interface ITestTypeB 
{
}

実際に[ProtoContract]は、インターフェースの前にあるものはすべて重要ではないかもしれません。それらをまとめて取り出すこともうまくいくようです。

于 2012-06-18T07:24:46.453 に答える