Serialization 为什么协议缓冲区编译器生成的消息类都是不可变的?

Serialization 为什么协议缓冲区编译器生成的消息类都是不可变的?,serialization,protocol-buffers,Serialization,Protocol Buffers,协议缓冲区编译器生成的消息类是不可变的。消息类包含适当的setter方法,但没有getter方法。此约束不适用于其他序列化技术,如Java二进制序列化、XML、JSON等 根据我的理解,在进行并发编程时,不变性是有用的。不变性有助于实现线程安全。但是,我假设,这不是协议缓冲区的原因 使消息类不可变的原因是什么 阅读协议缓冲文档后,上面所述只适用于java(至少),而不适用于C++和其他支持的平台/语言。 注:这个问题只是为了满足我的好奇心 谢谢。谷歌的实现确实使用了一种构建器模式,即可变(但在实

协议缓冲区编译器生成的消息类是不可变的。消息类包含适当的setter方法,但没有getter方法。此约束不适用于其他序列化技术,如Java二进制序列化、XML、JSON等

根据我的理解,在进行并发编程时,不变性是有用的。不变性有助于实现线程安全。但是,我假设,这不是协议缓冲区的原因

使消息类不可变的原因是什么

阅读协议缓冲文档后,上面所述只适用于java(至少),而不适用于C++和其他支持的平台/语言。 注:这个问题只是为了满足我的好奇心


谢谢。

谷歌的实现确实使用了一种构建器模式,即可变(但在实体方面不是很有用)构建器,它创建了一个不可变的对象实例。这不是一个要求——事实上,对于一些不使用此设计模式的平台,存在替代实现。但坦率地说,这根本不是问题,因为如果存在任何摩擦(以及您描述的摩擦),那么您应该避免使用DTO类型(即用于序列化的对象)作为主要域实体类型。一旦您这样做了,它就不再是问题了:您可以使用您喜欢的任何模式(包括任何域逻辑等)编写自己的域实体类型,然后在需要时映射到DTO类型;那么,DTO层使用的设计模式的选择仅仅是一个无趣的实现细节


但同样:对于您选择的平台,请查看是否可能更适合您的要求。

我刚刚开始学习protobuf。我问这个问题是出于好奇。我不会因为消息类的不变性而面临任何阻塞。我应该在问题中提到它。这并不能回答基本问题。为什么java和C++不允许它们在java中不可变?因为托马斯,这是Java中非常常见的习惯用法。