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

时间:2018-02-05 12:33:49

标签: serialization .net-core protobuf-net .net-standard private-members

编辑:问题出在Nancy上。 Protobuf-net(de)序列化了标记的私有字段。

我正在运行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
    {
    }
}

我使用了公共IEnumerable<int>来避免可变性并隐藏实现细节。它由私有List<int>支持以允许序列化。但是, protobuf-net只会 de 序列化该字段,如果我将其公开。另一方面,序列化实际上将包括数据,即使该字段是私有的。

这是预期的行为吗?是否有一种干净的方法可以在反序列化时使protobuf-net荣誉标记为私有字段?

P.S。非集合成员也会看到相同的行为,但我已使用IEnumerable / List进行了演示,因为它显示了此方法的原因。

1 个答案:

答案 0 :(得分:1)

在定位netcoreapp2.0net45时,以下内容的工作方式相同(除了输出的第一行)。我很乐意提供帮助,但我需要看到一个失败的例子。我正在使用:

<PackageReference Include="protobuf-net" Version="2.3.6" />

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using ProtoBuf;
[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
    {
    }
}
static class Program
{
    static void Main()
    {
#if NETCOREAPP2_0
        Console.WriteLine(".NET Core 2.0");
#elif NET45
        Console.WriteLine(".NET 4.5");
#endif
        var obj = new Model(123, new int[] { 4, 5, 6 });
        var clone = Serializer.DeepClone(obj);
        Console.WriteLine(clone.Example);
        foreach (var val in clone.A)
        {
            Console.WriteLine(val);
        }
    }
}