So sánh json_encode và serialize trong PHP

tải xuống 2

Hai hàm json_encode và serialize trong PHP đều có thể được dùng để chuyển đổi một giá trị kiểu object hoặc array về kiểu string. Tuy nhiên logic chuyển đổi của hai hàm này là không giống nhau. Ngoài ra với cùng một giá trị sử dụng để chuyển đổi thì chuỗi nhận được sau cùng có các định dạng hoàn toàn khác nhau.

Contents

Giá Trị Trả Về

Để so sánh sự khác biệt giữa giá trị trả về giữajson_encode và serialize chúng ta hãy xem xét một ví dụ cụ thể sau:

$obj = new stdClass();
$obj->firstProperty = "First value";
$obj->secondProperty = "Second value";

Tiếp theo chúng ta sẽ sử dụng json_encode để chuyển đối tượng $obj ở trên về kiểu string:

echo json_encode($obj);

Lúc này khi chạy đoạn mã trên bạn sẽ nhận về kết quả:

{"firstProperty":"First value","secondProperty":"Second value"}

Ngược lại khi sử dụng serialize:

echo serialize($obj);

Bạn sẽ nhận về kết quả:

O:8:"stdClass":2:{s:13:"firstProperty";s:11:"First value";s:14:"secondProperty";s:12:"Second value";}

Qua ví dụ ở trên đây bạn có thể thấy rằng hàm json_encode trả về chuỗi có số lượng ký tự ít hơn so với serialize. Ngoài ra thì chuỗi trả về bởi json_encode được cấu trúc theo kiểu thân thiện với mắt con người hơn là khi dùng serialize.

Lời khuyên ở đây là khi bạn cần chuyển đổi một số lượng lớn các objectvà việc tiết kiệm dung lượng (của RAM hoặc ổ cứng…) là yếu tố quyết định thì bạn nên sử dụng json_encode.

Visibility của Thuộc Tính (Public, Private, Protected)

Khi so sánh visibility giữa hai json_encode và serialize chúng ta sẽ so sánh khả năng chuyển đổi giá trị của thuộc tính public và private trong object. Để hiểu rõ về điều này chúng ta cùng xem xét ví dụ sau:

class Obj {
    private $firstProperty = "First";
    public $secondProperty = "Second"; 
}

$obj = new Obj();

Ở trên chúng ta định nghĩa một class Obj với hai thuộc tính là $firstProperty và $secondProperty tuy nhiên thuộc tính $firstProperty là thuộc tính private.

Lúc này khi chúng ta gọi hàm json_encode trên đối tượng $obj như sau:

echo json_encode($obj) . "\n";

Thì kết quả trả về sẽ là:

{"secondProperty":"Second"}

Ngược lại đối với serialize:

echo serialize($obj) . "\n";

Kết quả sẽ là:

O:4:"Obj1":2:{s:19:"Obj1firstProperty";s:5:"First";s:14:"secondProperty";s:6:"Second";}

Như vậy có thể thấy hàm json_encode không lấy ra các giá trị của các thuộc tính có visibility là private (và tương tự đối với protected) trong khi đó serialize thì vẫn lấy ra được giá trị của các thuộc tính này.

Performance

Chúng ta sẽ sử dụng đoạn code sau đây để kiểm tra performance giữa hai hàm json_encode() và serialize():

<?php
$obj = new stdClass();
$obj->firstProperty = "First value";
$obj->secondProperty = "Second value";

// json_encode
$start = microtime();
for ($i = 0; $i < 100; $i++)
        json_encode($obj);

$end = microtime();
echo $end - $start, "\n";

// serialize
for ($i = 0; $i < 1000; $i++)
        serialize($obj);

$end = microtime();
echo $end - $start, "\n";

Logic của đoạn code trên khá đơn giản, đầu tiên chúng ta tạo một object $obj với hai thuộc tính firstProperty và secondPropertygiống như ví dụ trước. Sau đó chúng ta sẽ sử dụng từng hàm json_encode và serialize trong một vòng lặp và lần lượt ghi lại thời gian mà các hàm này cần.

Ở trên máy thì mình khi chạy đoạn code trên thì nhận được kết quả như sau:

0.00019799999999998
0.001377

Khi tăng độ lớn dữ liệu của $obj cũng như số lượng vòng lặp cần chạy thì khác biệt về thời gian sử dụng cũng tăng lên. Bạn cũng có thể chạy thử trên máy bạn để kiểm tra lại.

Như vậy có thể thấy rằng hàm json_encode có tố độ xử lý nhanh hơn serialize.

Portability

Khi đề cập tới portability ở đây chúng ta muốn xem xét tới khía cạnh việc dữ liệu trả về của hàm json_encode và serialize có thể sử dụng với các ngôn ngữ lập trình khác hay không. Rõ ràng thì json_encode là người thắng cuộc khi so sánh ở điểm này bởi vì dữ liệu trả về của hàm này đi theo format JSON. JSON là format phổ biến và được hầu hết các ngôn ngữ lập trình hỗ trợ. Do đó nếu bạn cần xử lý kết quả trả về bằng hàm json_encode thì bạn sẽ không gặp nhiều khó khăn. Ví dụ khi sử dụng JavaScript bạn có thể sử dụng hàm JSON.parse() để xử lý chuỗi JSON từ PHP.

Ngược lại serialize trả về kiểu format dữ liệu dành riêng trong PHP. Do đó việc xử lý chuỗi kết quả trả về của hàm này có thể sẽ tốn thêm nhiều bước. Ví dụ trong ngôn ngữ JavaScript không có hàm nào hỗ trợ việc phân tích chuỗi trả về từ hàm serialize.

 

Trả lời