首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP serialize 與 JSON 深度對比:序列化選型指南與效能分析

     編輯:PHP 綜合知識

前言

PHP serialize() 與 json_encode() 都是將變量轉為字符串以便儲存或傳輸,但兩者在適用場景、效能、相容性上有本質差異。本文通過實例深度對比,助你做出正確選型。

serialize() 序列化

輸出格式

$arr = [
    0 => [
        "gameName" => "德乙",
        "homeName" => "比勒費爾德",
        "guestName" => "不倫瑞克",
        "endTime" => "2015-08-21"
    ],
    1 => [
        "gameName" => "英超",
        "homeName" => "水晶宮",
        "guestName" => "阿斯頓維拉",
        "endTime" => "2015-08-22"
    ]
];

$serialize = serialize($arr);
echo $serialize;
// 輸出:
// a:2:{i:0;a:4:{s:8:"gameName";s:6:"德乙";s:8:"homeName";s:15:"比勒費爾德";s:9:"guestName";s:12:"不倫瑞克";s:7:"endTime";s:10:"2015-08-21";}i:1;a:4:{s:8:"gameName";s:6:"英超";s:8:"homeName";s:9:"水晶宮";s:9:"guestName";s:15:"阿斯頓維拉";s:7:"endTime";s:10:"2015-08-22";}}

格式解析

反序列化

$restored = unserialize($serialize);
print_r($restored);  // 還原原始陣列結構

JSON 格式化

$jsonencode = json_encode($arr);
echo $jsonencode;
// 輸出:
// [{"gameName":"\u5fb7\u4e59","homeName":"\u6bd4\u52d2\u8d39\u5c14\u5fb7","guestName":"\u4e0d\u4f26\u745e\u514b","endTime":"2015-08-21"},{"gameName":"\u82f1\u8d85","homeName":"\u6c34\u6676\u5bab","guestName":"\u963f\u65af\u987f\u7ef4\u62c9","endTime":"2015-08-22"}]

還原為陣列

$restored = json_decode($jsonencode, true);  // true = 關聯陣列
print_r($restored);

核心差異對比

標記含義範例
aArray (陣列)a:2 = 2個元素的陣列
iInteger (整數)i:0 = 整數 0
sString (字符串)s:8:"gameName" = 長度8的字符串
oObject (物件)O:8:"stdClass":3:{...}
bBooleanb:1 = true
dDouble (浮點數)d:3.14
NNULLN;
維度serialize()json_encode()
可讀性低(需解析器)高(人類可讀)
跨語言僅 PHP 可解析所有主流語言支援
資料類型完整保留(資源、物件、類別資訊)基礎類型(陣列、物件、標量、null)
物件還原自動呼叫 __wakeup(),保留類別還原為 stdClass,失去原類別
輸出體積較大(含類型標記、長度)較小(緊湊格式)
編碼處理原始二進制安全UTF-8 強制,中文轉 \uXXXX
效能序列化較快,反序列化較慢編解碼速度均衡
安全性反序列化有風險(物件注入)純數據,無執行風險

效能基準測試參考

$data = [/* 大型測試數據 */];

// serialize
$start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
    $s = serialize($data);
    $u = unserialize($s);
}
echo "serialize: " . (microtime(true) - $start) . "s\n";

// json
$start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
    $j = json_encode($data);
    $d = json_decode($j, true);
}
echo "json: " . (microtime(true) - $start) . "s\n";
// 典型結果:serialize 序列化快 ~20%,json 反序列化快 ~30%,整體接近

選型決策樹

需要跨語言/前端使用?
  ├─ 是 → JSON (唯一選擇)
  └─ 否 → 需保留物件類別/資源類型?
        ├─ 是 → serialize() (配合 __sleep/__wakeup)
        └─ 否 → 純陣列/標量數據?
              ├─ 儲存到資料庫/快取 → JSON (體積小、可讀、通用)
              ├─ Session/檔案儲存、PHP 內部傳遞 → 任皆可
              └─ 高頻熱點路徑 → 基準測試決定

安全警示:反序列化漏洞

// 危險:不可信數據反序列化
$userData = unserialize($_COOKIE['data']);  // 可能觸發 __wakeup()、__destruct() 鏈

// 安全:僅用 JSON
$userData = json_decode($_COOKIE['data'], true);

原則:永遠不要對不可信輸入使用 unserialize(),這是 PHP 歷史上最嚴重的漏洞類別之一(CVE-2016-7124 等)。

總結

  • JSON:現代 Web 開發首選,API、快取、配置、跨語言、安全
  • serialize:PHP 內部物件持久化、Session 儲存器、需保留類別資訊的舊系統
  • 新專案建議:默認使用 JSON,僅在明確需要物件還原時考慮 serialize
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved