第4章 对象序列化(Object Serialization)

序列化是跨进程数据契约,不是内存复制;字段表示、引用身份、压缩和版本演进必须一起设计。

直觉:先找唯一事实

序列化是跨进程数据契约,不是内存复制;字段表示、引用身份、压缩和版本演进必须一起设计。 真正的难点不是让一次理想样本跑通,而是让消息身份、世界版本、状态权威和时间预算在丢包、乱序、重复与断线后仍可解释。先预测:如果只保存最终成功画面,本页最可能隐藏哪一种分歧?

权威目录定位

本页依据 Addison-Wesley / InformIT 官方书目与官方目录样章锁定范围。英文标题用于一对一追踪,中文正文为独立教学重构;现代平台差异、安全强化和可观察性补充会明确披露:

  • The Need for Serialization
  • Streams
  • Referenced Data
  • Compression
  • Maintainability
  • Summary
  • Review Questions
  • Additional Readings

本页逐项覆盖8个公开目录条目,并纳入同一套正常、边界、失败与恢复验收。

核心概念与所有权

、、、、 。每个概念都要回答:谁创建输入,谁拥有可变状态,哪个序号或版本拒绝旧结果,断线后由谁恢复。

#概念工程含义
1序列化把内存中的逻辑状态编码为可传输、可验证字节表示的过程。
2位流以位而非整字节为粒度顺序读写字段的缓冲抽象。
3对象引用在消息中以稳定标识指向另一个复制对象而非复制本地指针。
4量化用有限位宽和已知范围近似表示连续数值以降低带宽。
5模式演进协议字段随版本增加、废弃或改变时保持兼容和明确拒绝的规则。

机制拆解

1. 从逻辑字段出发,而非复制结构体

结构体包含填充、平台字节序、指针和编译器布局,不能成为线上格式。应逐字段定义类型、范围、是否可缺省和最大长度,并让读取器在消费前验证剩余字节,避免畸形长度触发越界或内存放大。

先预测:若省略这一层,哪一个序号、所有权或时间预算会最先失真?

2. 引用需要网络身份

本地指针只在一个地址空间有效。对象图跨网络时,要先为可复制对象分配稳定网络ID,再决定引用目标尚未出现、已销毁或重复到达时的处理。解析顺序必须允许延迟绑定,而不能制造悬空对象。

先预测:若省略这一层,哪一个序号、所有权或时间预算会最先失真?

3. 压缩与可维护性共同签发

位打包、范围量化和上下文编码能省带宽,却会增加版本耦合。每项压缩都应记录误差预算和回退格式;读取旧版本、跳过未知字段、拒绝不支持的必需字段都要由测试覆盖。

先预测:若省略这一层,哪一个序号、所有权或时间预算会最先失真?

六阶段证据链

可操作链条是:定义逻辑模式 → 选择字节与位序 → 编码标量字段 → 解析引用身份 → 量化压缩 → 跨版本往返验证。正常样本证明能力,边界样本证明预算,失败样本证明拒绝,恢复样本证明状态与资源重新收敛。

最小实现骨架

以下代码是独立复现实验骨架,不复制原书代码。序号比较必须处理回绕,生产实现还需补齐平台错误、认证、容量与资源清理。

struct NetworkEvidence {
  std::uint32_t sequence;
  std::uint32_t worldVersion;
  std::uint64_t objectId;
  double sentAtMs;
  double appliedAtMs;
};
 
bool accepts(const NetworkEvidence& next, const NetworkEvidence& current) {
  return next.objectId == current.objectId &&
         next.worldVersion >= current.worldVersion;
}

证据记录把目录、时序与状态摘要放在一起:

book: Multiplayer Game Programming
page: mgp-04-object-serialization
official_entries: 8
sample: normal | boundary | failure | recovery
protocol_version: fixed
network_seed: fixed
state_owner: explicit
first_divergence: null

故障脚本一次只改变一个变量:

baseline -> inject(delay | jitter | loss | duplicate | disconnect)
observe -> stop_at_first_divergence
recover -> replay_same_version_seed_and_input
assert -> one_authority && converged_state && no_orphan_resource

常见误区与故障注入

验收矩阵

样本网络与输入变化预期状态通过条件
正常合法版本、顺序、身份与容量六阶段完成权威摘要与对象身份一致
边界临界延迟、抖动、回绕或满载达到预算不越界队列有界且无永久饥饿
失败丢包、重复、畸形、断线或节点失效首偏离点停止明确拒绝、回滚或接管
恢复清除故障后重放同一输入收敛到正常轨迹无双权威、幽灵对象和资源泄漏

本页签发不变量是:线上格式独立于内存布局;引用由稳定ID解析;压缩误差与版本兼容都在契约内。 单次演示、平均延迟或最终截图不能替代序号、版本、首偏离点和恢复证据。

练习

小结

  • 序列化:把内存中的逻辑状态编码为可传输、可验证字节表示的过程。
  • 位流:以位而非整字节为粒度顺序读写字段的缓冲抽象。
  • 对象引用:在消息中以稳定标识指向另一个复制对象而非复制本地指针。
  • 量化:用有限位宽和已知范围近似表示连续数值以降低带宽。
  • 模式演进:协议字段随版本增加、废弃或改变时保持兼容和明确拒绝的规则。
  • 六阶段机制链已经映射到正常、边界、失败和恢复证据。
  • 官方目录逐项追踪,现代补充不会冒充原书正式分节。

术语表

来源与改编边界

讨论

评论区加载中…