Mengapa WordPress memilih serialisasi data daripada json_encode?

13

Dalam usia saya yang kecil dengan WordPress, saya telah melihat WordPress itu sendiri dan plugin yang ramah menggunakan PHP serialize()dalam menyimpan data ke db dalam banyak kasus. Tetapi dalam pencarian baru-baru ini saya menemukan dukungan komunitas yang serius untuk json_encode()over the serialize().

Dan saya pribadi menguji array asosiatif dengan keduanya, yang menunjukkan:

  • serialize() menyimpan 342 karakter
  • json_encode() menyimpan 285 karakter

Kenapa saya menanyakan ini?

Saya sedang mengerjakan proyek sementara saya akan menyimpan bidang meta berulang ke pos. Dimana:

  • Data pada dasarnya dalam bahasa Inggris, tetapi kadang-kadang bisa bahasa Bengali
  • Data akan berupa array asosiatif, sedalam 3 level (saya harap saya memahami level dengan benar):
array(
    1 => array(
        'key'=>'value',
        'key2'=>'value'
    ),
    2 => array(
        'key'=>'value',
        'key2'=>'value'
    )
)

Saya telah memeriksa bidang postmetatabel meta_valueitu a longtext, itu berarti panjang 4.294.967.295 karakter (4GB).

Jadi saya butuh solusi yang kuat untuk menyimpan barang.

Mayeenul Islam
sumber
Singkatnya, Legacy. WordPress mendahului adopsi JSON yang meluas, dan sebagai akibatnya, banyak situs bergantung pada API, jadi di sini membingungkan para pengembang baru yang tidak membaca bahwa itu ditinggalkan ....
Nate Symer

Jawaban:

13

Saya pikir, tidak 100% yakin bahwa ini adalah alasan sebenarnya para pengembang WP mengambil pendekatan ini, tetapi akal sehat memberi tahu saya bahwa serialisasi mempertahankan tipe variabel dan memiliki mini built dalam deteksi kesalahan, dan json hanya menyimpan nilai string { key : value }, jadi ketika Anda kembali ke PHP Anda harus menebak formatnya, atau membuat parser untuk itu. Ini akan memaksa Anda untuk memiliki dua cara berbeda untuk menangani data Anda: sebelumnya, untuk menyimpan data sebagai json dan setelah mendekode json itu akan kembali sebagai objek yang sama sekali berbeda.

Ini adalah alasan utama perbedaan ukuran, PHP tidak hanya menyimpan array; itu menyimpan berapa banyak elemen dalam array ketika serial, jenisnya, dan nilainya.

Anda tidak hanya menyimpan pasangan nilai kunci pada basis data tetapi Anda juga dapat menyimpan objek dengan tipe variabel berbeda.

Ramy Deeb
sumber
Saya paling suka jawabannya. Poin yang sangat membantu.
Mayeenul Islam
1
Biasanya apa yang terdengar positif dalam jawaban ini dengan data yang disita hanya membuatnya lebih kompleks (dan tidak aman) daripada dengan serialisasi yang lebih sederhana dengan JSON. Hanya mengatakan. Alasan sebenarnya adalah seperti yang diberikan dalam jawaban lain bahwa saat fitur diperkenalkan, hanya ada fungsi serialisasi PHP, JSON belum ada di sana.
hakre
6

Pengkodean JSON diperkenalkan di PHP 5.2, WordPress jauh lebih tua, dan ia lahir (dan dirancang untuk) PHP 4.

Serialisasi data adalah hal yang meresap di WordPress, jadi beralih dari serialisasi PHP ke pengkodean JSON akan berarti masalah kompatibilitas yang sangat besar, dan jika saya tahu sedikit WordPress, itu tidak akan pernah terjadi.

Yang mengatakan, jika Anda berpikir bahwa pengkodean JSON lebih baik untuk Anda daripada serialisasi PHP, gunakan saja.

Jika Anda meneruskan sebuah string (yaitu versi data JSON-encoded Anda) untuk memposting fungsi meta, WordPress tidak akan menyentuhnya, tetapi kemudian Anda perlu mengingat untuk mendekode data JSON saat pengambilan.

Jika ukuran penyimpanan DB sangat penting bagi Anda, itu mungkin layak untuk pekerjaan tambahan, jika tidak biarkan WordPress menggunakan apa yang digunakannya dan tidak peduli.

Mungkin, Anda dapat mengevaluasi apakah itu kasus tabel kustom untuk menyimpan data Anda.

gmazzap
sumber
3

Saya tergoda untuk menutup ini sebagai "tunduk pada pendapat" tetapi saya pikir ada beberapa jawaban yang bagus untuk pertanyaan itu. Saya akan pergi dengan "sejarah".

1) json_encoderelatif baru dalam inti PHP.

json_encode

(PHP 5> = 5.2.0, PECL json> = 1.2.0) json_encode - Mengembalikan representasi JSON dari suatu nilai

http://php.net/manual/en/function.json-encode.php

json_encodetidak akan dapat diandalkan di hari-hari awal WordPress. Itu hanya digulung ke dalam "inti" PHP di 5.2, meskipun itu tersedia sebagai ekstensi PECL jauh sebelum itu.

Kedua, jika Anda memberi makan objek seperti WP_Queryobjek ke json_encodeAnda mendapatkan stdClassobjek json_decode. serializeSaya unserializeakan melestarikan objek.

s_ha_dum
sumber
+1. Tapi saya keberatan "tunduk pada pendapat", karena saya bukti yang berdampingan. Dan yang terakhir: masalah terkait kelas: Saya sudah menyebutkan itu di tautan kedua (alasan mengapa tidak json_encode).
Mayeenul Islam