protobuf-net 是否允许在类型移动程序集或命名空间时向后兼容

本文关键字:命名空间 程序集 是否 移动 类型 protobuf-net | 更新日期: 2023-09-27 18:37:17

我目前很难将 DTO 从一个程序集和命名空间移动到另一个程序集和命名空间。这是因为我使用二进制序列化来发送/接收数据。在二进制序列化中,协定基本上是程序集名称和类型命名空间 + 名称。如果将类型移动到其他程序集,则实质上会破坏协定。

protobuf-net的行为方式是否相同?protobuf-net合约的基础是什么?probuf-net 是否允许我将类型从一个程序集移动到另一个程序集而不会破坏向后兼容性?移动命名空间呢?

protobuf-net 是否允许在类型移动程序集或命名空间时向后兼容

这个简短的版本是"是的,那会很好 - 像这样工作是我最初写它的主要原因之一"。

在二进制序列化中,协定基本上是程序集名称和类型命名空间 + 名称。

这取决于你如何定义"二进制序列化";如果你的意思是"序列化到碰巧是二进制的东西,即非文本",那么这是无关的。如果您的意思是"基于类型的序列化",那么:确实 - 这是一个主要痛点。

protobuf-net的行为方式是否相同?

不,它没有。

protobuf-net合约的基础是什么?

根本不描述类型;调用方提供最外层成员的类型,所有其他类型都由类型的布局隐含。

成员仅通过数字键识别;如果这些键存在于两端(它们不一定需要:您可以添加/删除成员),那么它们必须是兼容的。例如,这些是兼容的:

[ProtoContract]
public class Foo { // in namespace X
    [ProtoMember(1)]
    public int Id {get;set;}
    [ProtoMember(2)]
    public string Name {get;set;}
}
...
[ProtoContract]
public class User { // in namespace Y
    [ProtoMember(2)]
    public string UserName {get;set;}
}

如果序列化Foo然后将其反序列化为User,则字段 2 中的数据将推送到UserName(默认情况下忽略字段 1 中的数据,但如果需要,可以存储)。然而,这与Foo无关

[ProtoContract]
public class BadClass {
    [ProtoMember(2)]
    public double Quantity {get;set;}
}

(这将失败,因为stringdouble的电线类型无法远程比较)

probuf-net 是否允许我将类型从一个程序集移动到另一个程序集而不会破坏向后兼容性?移动命名空间呢?

对两者都是的。当您考虑到可以在 C# 中进行序列化并在 Java 或C++模型中反序列化时,它必须以这种方式工作。