我可以反序列化为 protobuf-net 中接口的只读属性吗?
Posted
技术标签:
【中文标题】我可以反序列化为 protobuf-net 中接口的只读属性吗?【英文标题】:Can I deserialize to a read-only property of an interface in 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。
【问题讨论】:
不,你不能,对象是被构造的,因此错过了使用你的私人集合的机会。 【参考方案1】:没有。绑定到接口时,它会绑定到接口,因此它不能利用绑定到具体类型时可用的任何私有设置器(等)。您可以这样做的唯一方法是宣传 Foo 的成员而不是 IFoo 进行序列化。
注意:在非接口场景中,它可以访问成员,甚至是所需的直接字段。
【讨论】:
以上是关于我可以反序列化为 protobuf-net 中接口的只读属性吗?的主要内容,如果未能解决你的问题,请参考以下文章
需要在运行时确定哪些类型 protobuf-net 可以序列化/反序列化
是否可以在 Silverlight 中使用 protobuf-net 对私有属性进行(反)序列化?
我可以使用 Protobuf-net 对已用 Java 序列化的数据进行反序列化吗?
ProtoBuf-net 中集合 AsReference 的序列化
我可以使用 protobuf-net 在 Mono 中序列化一个对象(包含成员:字典、列表...等)并在 MS.NET 中反序列化它,反之亦然?