有没有办法让以前公开的无参数构造函数私有化,而不会对 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(反)序列化进行重大更改?的主要内容,如果未能解决你的问题,请参考以下文章

在私有继承中公开构造函数

Python中的私有构造函数

构造函数的调用规则

Dart类(构造函数、单例)

构造方法

构造函数的特点