Serialization Protobuf net/NetCore2:反序列化忽略带注释的私有字段

Serialization Protobuf net/NetCore2:反序列化忽略带注释的私有字段,serialization,.net-core,protobuf-net,.net-standard,private-members,Serialization,.net Core,Protobuf Net,.net Standard,Private Members,编辑:问题出在。Protobuf net(反)序列化标记的私有字段很好。 我正在运行一个NetCore 2.0单元测试项目。Protobuf net似乎是被忽略的私有字段,即使具有[ProtoMember]属性 [ProtoContract] internal class Model { [ProtoMember(1)] public int Example { get; private set; } // Works [ProtoMember(2)] priv

编辑:问题出在。Protobuf net(反)序列化标记的私有字段很好。

我正在运行一个NetCore 2.0单元测试项目。Protobuf net似乎是被忽略的私有字段,即使具有
[ProtoMember]
属性

[ProtoContract]
internal class Model
{
    [ProtoMember(1)]
    public int Example { get; private set; } // Works

    [ProtoMember(2)]
    private List<int> _a; // Not deserialized unless made public

    public IEnumerable<int> A => this._a;

    public Model(int example, IEnumerable<int> a)
    {
        this.Example = example;
        this._a = a.ToList(); // Copy prevents mutation
    }

    private Model() // For deserialization
    {
    }
}
[协议]
内部类模型
{
[原成员(1)]
公共int示例{get;private set;}//Works
[原成员(2)]
私有列表_a;//除非公开,否则不会反序列化
公共IEnumerable A=>这个;
公共模型(int示例,IEnumerable a)
{
这个例子=例子;
这个。_a=a.ToList();//复制可以防止突变
}
私有模型()//用于反序列化
{
}
}
我使用了一个公共的
IEnumerable
,以避免可变性并隐藏实现细节。它由一个私有的
列表支持,以允许序列化。但是,protobuf-net仅在我公开该字段时才会对其进行反序列化。另一方面,序列化实际上将包括数据,即使字段是私有的

这是故意的行为吗?在反序列化时,是否有一种干净的方法使protobuf net尊重标记的私有字段


另外,对于非集合成员也可以看到相同的行为,但我已经用
IEnumerable
/
List
进行了演示,因为它显示了这种方法的原因。

当目标为
netcoreapp2.0
net45
时,以下操作相同(除了输出的第一行)。我很乐意帮忙,但我需要看一个失败的例子。我正在使用:


代码:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用ProtoBuf;
[原始合同]
内部类模型
{
[原成员(1)]
公共int示例{get;private set;}//Works
[原成员(2)]
私有列表_a;//除非公开,否则不会反序列化
公共IEnumerable A=>这个;
公共模型(int示例,IEnumerable a)
{
这个例子=例子;
这个。_a=a.ToList();//复制可以防止突变
}
私有模型()//用于反序列化
{
}
}
静态类程序
{
静态void Main()
{
#如果NETCOREAPP2_0
Console.WriteLine(“.NETCore2.0”);
#埃利夫网45
Console.WriteLine(“.NET 4.5”);
#恩迪夫
var obj=新模型(123,新int[]{4,5,6});
var clone=Serializer.DeepClone(obj);
Console.WriteLine(clone.Example);
foreach(clone.A中的var val)
{
控制台写入线(val);
}
}
}

感谢您的快速回复!你的例子也适用于我。此外,我在我的项目中也遇到了类似的情况。让我隔离这个坏掉的类,看看它在一个测试应用程序中是否仍然出现故障……当我无法重现这个问题时,我开始研究序列化过程中发生的事情。结果表明protobuf net的反序列化工作正常,然后继续并忽略其模型绑定中的私有字段。这也解释了为什么响应没有问题,因为这只适用于传入的请求@谢谢你的帮助!我现在已经解决了我的问题,只需使用公共
IEnumerable
。我还没有意识到protobuf网络支持这一点!这在一定程度上是因为我最初只尝试了
IReadOnlyCollection
,它是可计数的,并且保证是物化的兄弟。您觉得如何支持像
IEnumerable
这样的有用的小接口?@Timo有一些代码支持只读集合类型,但不确定它是否在这种情况下工作;有点尴尬,坦白说-列表要简单得多:)有趣的是,我只能让它在
IEnumerable
上运行。不过,我还没有看过那个代码。