企业级数据传输需兼顾安全性、兼容性、性能与可维护性,强制使用DTO替代Entity,禁用Java原生序列化,内部用Protobuf、对外用JSON,敏感字段标transient,集合需泛型初始化,并建立DTO版本兼容与灰度验证机制。

企业级数据传输对序列化的要求远不止“能用”,而是要兼顾安全性、兼容性、性能和可维护性。规范不是靠一两个接口或工具堆砌,而是围绕业务场景建立一整套约束与约定。
明确分层对象边界,禁用Entity直传
数据库实体(Entity)通常包含敏感字段(如password)、冗余字段或ORM元数据,直接序列化传输会带来安全与性能风险。必须强制使用DTO作为服务间数据载体。
- DTO只携带当前接口必需的字段,命名体现业务语义(如
OrderSummaryDTO而非UserEntity) - 禁止在DTO中暴露数据库主键、版本号、逻辑删除标记等内部标识
- 所有DTO必须显式声明
serialVersionUID = 1L,避免因IDE差异导致反序列化失败
统一序列化协议选型,禁用Java原生二进制
Java原生序列化(ObjectOutputStream)虽简单,但存在严重缺陷:不可跨语言、字节体积大、反序列化漏洞高发、升级兼容性差。企业级系统应默认排除。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 内部微服务通信优先选用Protobuf:强契约、小体积、高性能、多语言支持,配合gRPC天然契合
- 对外API或前端交互使用JSON:保留可读性,通过Jackson配置全局忽略null值、日期格式统一为ISO-8601
- 严禁在HTTP请求体中传输Java原生序列化字节流(.ser文件)
敏感字段与不可序列化组件必须显式管控
序列化不是“自动全量导出”,而是有边界的主动导出。任何未加约束的序列化都可能泄露凭证、线程上下文或资源句柄。
立即学习“Java免费学习笔记(深入)”;
- 密码、token、密钥类字段必须标注
transient,且DTO构造时不得从Entity直接拷贝此类字段 - 禁止将
Thread、Socket、Connection等持有本地资源的对象放入DTO - 集合字段需指定泛型并初始化(如
private List<ItemDTO> items = new ArrayList<>()),避免反序列化时NPE
建立版本兼容策略与灰度验证机制
服务升级常伴随DTO结构调整,若缺乏兼容设计,会导致上下游服务大面积故障。
- 新增字段必须提供默认值(JSON用
@JsonInclude(JsonInclude.Include.NON_NULL),Protobuf设optional并赋默认) - 废弃字段不立即删除,先标记
@Deprecated并保留反序列化支持至少一个大版本周期 - 上线前用真实流量录制+回放,验证新旧DTO双向转换无数据丢失或类型错位

















