Protobuf-net / NetCore2:反序列化忽略带注释的私有字段
Protobuf-net / NetCore2: Deserialization ignores annotated private fields
编辑:问题出在 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
{
}
}
我使用了 public IEnumerable<int>
来避免可变性并隐藏实现细节。它由私有 List<int>
支持以允许序列化。但是,protobuf-net 只会 de 序列化字段,如果我做到 public。另一方面,即使字段是私有的,序列化实际上也会包含数据。
这是有意为之的行为吗?有没有一种干净的方法可以让 protobuf-net 在反序列化时尊重标记的私有字段?
P.S。对于非集合成员,可以看到相同的行为,但我已经用 IEnumerable
/List
进行了演示,因为它显示了采用这种方法的原因。
当目标 netcoreapp2.0
或 net45
时,下面的工作相同(除了输出的第一行)。我很乐意提供帮助,但我需要看到一个失败的例子。我正在使用:
<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);
}
}
}
编辑:问题出在 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
{
}
}
我使用了 public IEnumerable<int>
来避免可变性并隐藏实现细节。它由私有 List<int>
支持以允许序列化。但是,protobuf-net 只会 de 序列化字段,如果我做到 public。另一方面,即使字段是私有的,序列化实际上也会包含数据。
这是有意为之的行为吗?有没有一种干净的方法可以让 protobuf-net 在反序列化时尊重标记的私有字段?
P.S。对于非集合成员,可以看到相同的行为,但我已经用 IEnumerable
/List
进行了演示,因为它显示了采用这种方法的原因。
当目标 netcoreapp2.0
或 net45
时,下面的工作相同(除了输出的第一行)。我很乐意提供帮助,但我需要看到一个失败的例子。我正在使用:
<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);
}
}
}