有没有办法让以前公开的无参数构造函数私有化,而不会对 protobuf(反)序列化进行重大更改?
Posted
技术标签:
【中文标题】有没有办法让以前公开的无参数构造函数私有化,而不会对 protobuf(反)序列化进行重大更改?【英文标题】:Is there a way to make a previously-public parameterless constructor private without making it a breaking change for protobuf (de)serialization? 【发布时间】:2021-03-12 04:21:55 【问题描述】:鉴于其他项目和/或库使用的此类:
[Serializable, DataContract]
public class MatchResult
[DataMember(Order = 1)]
public long MatchId get; set;
[DataMember(Order = 2)]
public long TeamId get; set;
[DataMember(Order = 3)]
public MatchStatus Status get; set;
[DataMember(Order = 4)]
public List<AgentMatchInfo> AgentMatchInformation get; set;
public MatchResult()
// I want to make this a private one, without the consumers seeing
// errors that their declaration using
// this current public constructor is no loner applicable.
当构造函数声明当前被消费者显式调用时,如何正确地制作 current-public
无参数构造函数 private
以用于 protobuf(反)序列化,而不是对其进行重大更改?
让当前的public
构造函数有一个可选参数,同时添加一个private
无参数构造函数是一种好习惯,并且可以很好地与protobuf 配合使用吗?
【问题讨论】:
【参考方案1】:Protobuf-net 应该可以使用非公共构造函数。也许您使用的是受限框架?大多数情况下,如果仅使用私有构造函数 (private MatchResult()
) 不起作用,我会感到非常惊讶。
另一种方法是跳过构造函数完全,您可以通过使用[ProtoContract(SkipConstructor = true)]
而不是[DataContract]
和[ProtoMember(N)]
而不是[DataMember(Order = N)]
来做到这一点 - 但是,我想知道这是否将在非公共构造函数失败的框架上失败。
【讨论】:
接受这个答案,因为显然,我和一位同事之间在 protobuf 序列化和公共构造函数方面存在一些误解。现在我将构造函数公开。以上是关于有没有办法让以前公开的无参数构造函数私有化,而不会对 protobuf(反)序列化进行重大更改?的主要内容,如果未能解决你的问题,请参考以下文章