无需登录 数据私有 本地保存

PHP序列化数据转换器 - 与JSON互转

15
0
0
0
PHP 序列化数据
字符: 0 字节: 0
JSON 数据
字符: 0

常见问题与知识点

PHP 序列化(serialize())是将 PHP 变量转换为可存储或传输的字符串格式的过程。它广泛用于:Session 存储(PHP 默认将会话数据序列化后存储)、缓存系统(如 Redis/Memcached 存储复杂数据结构)、数据库存储(将数组或对象存入单个字段)、消息队列(在系统间传递结构化数据)。与之对应的是 unserialize() 函数,用于将序列化字符串还原为 PHP 变量。

Null:N;
布尔值:b:1;(true)或 b:0;(false)
整数:i:42;i:-7;
浮点数:d:3.14159;(也支持 INF 和 NAN)
字符串:s:5:"hello";(s:字节长度:"内容";)
数组:a:2:{i:0;s:5:"hello";i:1;i:42;}(a:元素数:{键值对...})
对象:O:8:"stdClass":1:{s:3:"key";s:5:"value";}(O:类名长度:"类名":属性数:{...})
引用:R:2;(指向之前序列化的第N个值,从1开始计数)
注:本工具暂不支持引用类型(R:)和自定义序列化类型(C:)的解析。

PHP 序列化 是 PHP 原生格式,保留完整的类型信息(类名、访问修饰符、引用关系等),但仅限 PHP 使用,跨语言兼容性差。
JSON 是轻量级通用数据交换格式,几乎所有编程语言都支持,可读性好,但类型表达能力有限(无类名、无引用、数字不分整浮)。
推荐做法:系统间通信优先使用 JSON;PHP 内部持久化(Session、缓存)可使用序列化;需要跨平台共享数据时务必选择 JSON。在微服务架构中,应尽量避免 PHP 序列化格式跨越服务边界。

这是由于两种格式的表达能力不同:PHP 对象 → JSON:默认会添加 __PHP_Class__ 字段保留类名以便还原(可在选项中去掉)。PHP 数组 → JSON:关联数组(字符串键)转为 JSON 对象,索引数组(连续整数键从0开始)转为 JSON 数组。特殊值:PHP 的 INFNAN 在 JSON 中无法表示,会转为字符串标记。Null 字节:PHP 对象属性的访问修饰符(protected/private)在序列化中使用 null 字节标记,JSON 中会以 \u0000 表示。

⚠️ 安全警告:PHP 的 unserialize() 是已知的安全风险来源。攻击者可以构造恶意序列化数据,利用对象注入漏洞(Object Injection)执行任意代码。永远不要对不可信来源的数据使用 unserialize()。如果必须处理外部序列化数据,建议使用 json_decode() + json_encode() 替代,或使用白名单限制可反序列化的类。WordPress、Drupal 等 CMS 历史上都曾出现过序列化相关的安全漏洞。

PHP 序列化中的字符串长度是按字节(byte)计算的,不是按字符数。在 UTF-8 编码下,英文字母占1个字节,中文字符通常占3个字节,emoji 表情占4个字节。例如字符串 "你好" 在 UTF-8 下占6个字节,序列化结果为 s:6:"你好";。本工具使用 TextEncoder API 进行精确的字节计数,确保与 PHP 行为一致。