2

[ProtoContract] を使用したインターフェイスと実装があります。インターフェイスで読み取り専用のプロパティが 1 つあります。インターフェイスとして宣言されたプロパティを逆シリアル化しようとすると、Protobuf で次のエラーが表示されます。

System.InvalidOperationException: Cannot apply changes to property IFoo.Id

私がテストしているコードは次のとおりです。

    public void Main()
    {
        using (var ms = new MemoryStream())
        {
            var x = new HasFoo {TheFoo = new Foo(1)};

            Serializer.Serialize(ms, x);
            ms.Position = 0;
            var clone = Serializer.Deserialize<HasFoo>(ms);

            Assert.AreEqual(1, clone.TheFoo.Id);
        }
    }


    [ProtoContract, ProtoInclude(100, typeof(Foo))]
    public interface IFoo
    {
        [ProtoMember(1)]
        long Id { get; }
    }

    [ProtoContract]
    public class Foo : IFoo
    {
        [ProtoMember(1)]
        public long Id { get; private set; }

        public Foo() { }

        public Foo(long id)
        {
            Id = id;
        }
    }

    [ProtoContract]
    public class HasFoo
    {
        [ProtoMember(1)]
        public IFoo TheFoo { get; set; }
    }

TheFooインターフェイスでセッターを宣言したくないので、可能な限りプロパティを宣言したままにしたいと思いIFooます。動作させる方法はありますか?protobuf-net v2 を使用しています。

4

1 に答える 1

4

いいえ。インターフェイスにバインドすると、インターフェイスにバインドされるため、具象型にバインドするときに使用できるプライベート セッター (など) を利用することはできません。これを行う唯一の方法は、IFoo の代わりにシリアル化のために Foo のメンバーをアドバタイズすることです。

注: 非インターフェースのシナリオでは、メンバー、または直接の直接フィールドにアクセスできます。

于 2012-04-06T16:37:12.207 に答える