有没有一种方法可以使以前的 public 无参数构造函数成为私有的,而不会使它成为 protobuf(反)序列化的破坏性变化?

Is there a way to make a previously-public parameterless constructor private without making it a breaking change for protobuf (de)serialization?

考虑到此 class 被其他项目 and/or 库消耗:

[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.
    }
}

当构造函数声明当前被显式调用时,您如何正确地使当前-public 无参数构造函数 private 用于 protobuf(反)序列化而不使其成为破坏性更改消费者?

让当前的 public 构造函数有一个可选参数,同时添加一个 private 无参数构造函数是一个好习惯吗?

Protobuf-net 应该 可以使用非public 构造函数。也许您使用的是受限框架?在大多数情况下,如果仅使用私有构造函数 (private MatchResult() {}) 不起作用,我会感到非常惊讶。

另一种方法是完全跳过构造函数 ,您可以使用 [ProtoContract(SkipConstructor = true)] 代替 [DataContract],并使用 [ProtoMember(N)] 代替[DataMember(Order = N)] - 但是,我想知道这是否会在那些非 public 构造函数失败的框架上失败。