【问题标题】:Can I deserialize to a read-only property of an interface in protobuf-net?我可以反序列化为 protobuf-net 中接口的只读属性吗?
【发布时间】:2012-04-06 16:10:04
【问题描述】:

我有一个接口和一个实现,都带有 [ProtoContract]。有一个属性,在界面上是只读的。当我尝试反序列化声明为接口的属性时,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; }
    }

我宁愿不在接口上声明一个 setter,而且如果可能的话,我希望将 TheFoo 属性声明为 IFoo。有什么方法可以让它起作用吗?我正在使用 protobuf-net v2。

【问题讨论】:

  • 不,你不能,对象是被构造的,因此错过了使用你的私人集合的机会。

标签: c# serialization protocol-buffers protobuf-net


【解决方案1】:

没有。绑定到接口时,它会绑定到接口,因此它不能利用绑定到具体类型时可用的任何私有设置器(等)。您可以这样做的唯一方法是宣传 Foo 的成员而不是 IFoo 进行序列化。

注意:在非接口场景中,它可以访问成员,甚至是所需的直接字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2012-04-20
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多