SDET / SWE · Technical Fundamentals

TikTok Python 序列化:数据契约、类型还原与信任边界

比较JSON与对象序列化,明确schema、版本、字符编码和坏输入处理。

题目重点:比较JSON与对象序列化,明确schema、版本、字符编码和坏输入处理。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 练习是服务接口或snapshot交换数据,优先明确有限schema;没有公司指定格式。
  • 不从不可信来源反序列化可执行对象格式。

解题路线

  1. 序列化把状态编码为可存储传输表示,反序列化把表示解析成数据;不等于赋值或深复制。要先定义交换的是值还是对象身份、共享关系和类类型。
  2. JSON常适合跨语言基础值,tuple通常成为数组并解码为list,字典键与数值范围也需约束;不能仅以编码成功就宣称类型完全可逆。日期、Decimal、bytes需要显式编码规则。
  3. 加schema/format版本,规定必填字段、未知字段和兼容策略,验证长度/深度/类型与数值范围。UTF-8等字符编码是字节边界,网络上的bytes不能默认当已解析对象。
  4. 反序列化先到局部候选,再校验,最后发布或事务写入,避免解析到一半污染旧状态。重复键、无穷数、截断字节和错误版本应有确定失败政策。
  5. pickle类对象格式可执行构造行为,不能用作不可信输入解析。真实性/完整性需求用签名或认证通道,checksum只能检测意外损坏,不能阻止攻击者重写。
  6. 测试不只round-trip相等,还覆盖跨版本、跨语言、大数、缺字段、未知字段、非法编码与资源预算。serialize/decode均使用同一错误假设时round-trip可能假通过,要验证外部schema约束。

手动走一遍

json.loads(json.dumps({x:(1,2)}))得到{x:[1,2]},值形似但tuple类型已变。snapshot恢复还需确认覆盖还是merge,并在错误输入下保留原状态;其实现另见KV题解。

规模与取舍

数据字节B及节点V通常O(B+V)编码解码,空间需容纳输入/候选/输出;嵌套深度影响栈。压缩与加密另计,限制大小和深度防止无限资源消耗。

易错点与追问

容易失分的边界

  • 序列化等同深复制且保留所有类型。
  • 不可信pickle直接loads。
  • 坏输入解析过程中逐步覆盖业务状态。

继续深挖

  • 如何做版本迁移?
  • 大整数跨语言如何保精度?
  • 校验和、签名、加密分别解决什么?
✓已复制微信号!