【问题标题】:Does protobuf-net allow backward compability when a type has moved assemblies or namespaces?当类型移动程序集和命名空间时,protobuf-net 是否允许向后兼容?
【发布时间】:2013-11-09 01:36:17
【问题描述】:

我目前很难将 DTO 从一个程序集和命名空间移动到另一个程序集和命名空间。这是因为我使用二进制序列化来发送/接收数据。在二进制序列化中,契约基本上是程序集名称和类型命名空间+名称。如果您将类型移动到不同的程序集,您基本上违反了合同。

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

【问题讨论】:

    标签: c# .net serialization protobuf-net backwards-compatibility


    【解决方案1】:

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

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

    这取决于您如何定义“二进制序列化”;如果您的意思是“序列化恰好是二进制的东西,即非文本”,那么这是不相关的。如果您的意思是“基于类型的序列化”,那么:确实 - 这是一个主要的痛点。

    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++ 模型中反序列化时,它必须以这种方式工作。

    【讨论】:

    • “如果你序列化一个 Foo 然后反序列化它作为用户”这是否意味着我必须指定我希望它每次反序列化的类型?我希望反序列化能够根据序列化的内容(使用一些合同)自动检测要反序列化的类。如果 protobuf 可以做到这一点,那么它怎么知道“Foo”现在是“User”?如果它不能做到这一点,有没有办法获得同样的行为?
    • @Mark 是的,你需要告诉它根类型。这在大多数基于合约的序列化器中都是一样的——您需要对 XmlSerializer、DataContractSerializer、Json.NET 等执行此操作。因为它是纯数据:它没有明确的 CLI 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2015-02-14
    • 2020-03-07
    相关资源
    最近更新 更多