4

次のテストは、このエラーで失敗します。

「System.InvalidOperationException : 適切なデフォルト IB エンコーディングが見つかりません。」

[ProtoContract]
public class A
{
    [ProtoMember(1)]
    public IB B { get; set; }
}

public interface IB
{
}

[ProtoContract]
public class B : IB
{
    [ProtoMember(1)]
    public int SomeProperty { get; set; }
}

[TestFixture]
public class TestFixture
{
    [Test]
    public void Test()
    {
        var a = new A {B = new B()};
        using (var m = new MemoryStream())
        {
            Serializer.Serialize(m, a);
        }
    }
}

私は Protobuf.net のこの実装を使用しています:

http://code.google.com/p/protobuf-net/

私は何か見落としてますか?どうもありがとうございます。

4

1 に答える 1

2

これは、などを含むコントラクトベースのシリアライザーの一般的な機能ですXmlSerializer(つまり、すべてのオブジェクトのタイプメタデータを含まないもの)。

これをトリッキーにするいくつかのことがあります:

  • デシリアライズ中に、どのタイプを作成しA.Bますか?
  • シリアル化中、「現在のオブジェクトは何ですか」は契約とほとんど関係がありません
    • 特に、タイプが複数のインターフェイスを実装している場合は非常に厄介になります

これは、「v2」で何かを機能させたいシナリオです(ただし、リリースには完全ではないかもしれません)。考えている:

  • A.B最初はnull以外である必要があります(つまり、Aのタイプを決定するA.B)か、デフォルトの実装をどこかに指定する必要があります
  • インターフェイスベースは、相互に排他的であるか、継承です。インターフェイスを使用する場合、継承はサポートされません。
  • すべてのインターフェイスの使用はプロパティを介して行われ、フィールドは使用されません(明らかに)

あるいは、提示されたシナリオにより適している場合は、のようなものを使用[ProtoInclude]して具体的なタイプを示すことができます。

しかし、それらの制限の範囲内で、私は何かが可能だと思います。でも今日はだめ。

于 2010-06-23T14:31:26.853 に答える