在 PHP 开发中,经常需要将数组或对象转换为字符串进行存储(如存入数据库、缓存或文件)。PHP 提供了两种主流方式:json_encode 和 serialize。表面上看两者都能完成任务,但实际选择时有不少值得注意的细节。
存储开销对比
先说结论:JSON 编码后的体积通常更小。以一个包含 100 条用户记录的关联数组为例,json_encode 输出的字符串约为 serialize 的 60%~70%。原因在于 serialize 会保留 PHP 内部类型标记(如 s:5:"hello"),而 JSON 只存储纯数据。如果数据需要跨语言共享(如前端 JavaScript 读取),JSON 是唯一选择。
数据类型的支持差异
serialize 能完整保留 PHP 的所有数据类型,包括对象、私有属性、甚至闭包(部分场景)。而 json_encode 只能处理标量类型、数组和 stdClass 对象。如果你的数据结构中包含 DateTime 对象、SplFixedArray 等特殊类型,JSON 编码会直接丢失类型信息甚至报错。
性能实测
在小数据量(< 1KB)下两者差异可忽略不计。但当数据量增大到 100KB 以上时,json_encode 的编码速度约比 serialize 快 2~3 倍,解码速度优势更明显(约 3~5 倍)。这得益于 JSON 解析器的高度优化。
安全注意事项
使用 unserialize 时需要格外小心——如果反序列化的数据来自用户输入或不可信来源,可能触发 PHP 对象注入漏洞。相比之下 json_decode 天然安全,它只会生成纯数据,不会实例化任何类。这也是为什么在缓存系统(如 Redis)中,越来越多的项目选择 JSON 作为序列化格式。
选择建议
日常开发中的简单判断原则:如果数据需要跨语言读取,用 JSON;如果必须保留 PHP 特有类型,用 serialize;如果两者都可以,优先选 JSON——更小、更快、更安全。缓存场景建议统一使用 json_encode,并在 decode 时通过 json_decode($data, true) 强制返回数组以保持一致性。