gpt4 book ai didi

c# - 我可以反序列化为 protobuf-net 中接口(interface)的只读属性吗?

转载 作者:行者123 更新时间:2023-11-30 21:07:51 28 4
gpt4 key购买 nike

我有一个接口(interface)和一个实现,都带有 [ProtoContract]。有一个属性,在界面上是只读的。当我尝试反序列化声明为接口(interface)的属性时,Protobuf 给我这个错误:

System.InvalidOperationException:无法将更改应用于属性 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; }
}

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

最佳答案

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

注意:在非接口(interface)场景下,它会访问到成员,甚至直接访问 desired 的字段。

关于c# - 我可以反序列化为 protobuf-net 中接口(interface)的只读属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10046081/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com