¿Por qué WordPress elige la serialización de datos en lugar de json_encode?

13

En mi corta edad con WordPress, he visto que WordPress mismo y sus complementos amigables están utilizando PHP serialize()para almacenar datos en db en muchos casos. Pero en una búsqueda reciente encontré un serio apoyo de la comunidad para json_encode()el serialize().

Y personalmente probé una matriz asociativa con ambos, que muestra:

  • serialize() almacena 342 caracteres
  • json_encode() almacena 285 caracteres

¿Por qué estoy preguntando esto?

Estoy en un proyecto mientras voy a almacenar metacampos repetidos en una publicación. Dónde:

  • Los datos estarían básicamente en inglés, pero a veces pueden ser bengalíes
  • Los datos serían una matriz asociativa, de 3 niveles de profundidad (espero haber entendido los niveles correctamente):
array(
    1 => array(
        'key'=>'value',
        'key2'=>'value'
    ),
    2 => array(
        'key'=>'value',
        'key2'=>'value'
    )
)

He comprobado que el campo de la postmetatabla es meta_valueun longtext, eso significa una longitud de 4,294,967,295 caracteres (4GB).

Así que necesito una solución robusta para almacenar cosas.

Mayeenul Islam
fuente
En una palabra, legado. WordPress es anterior a la adopción generalizada de JSON y, como resultado, toneladas de sitios dependen de la API, por lo que está aquí para confundir a los nuevos desarrolladores que no leen que está en desuso ...
Nate Symer

Respuestas:

13

Creo que no estoy 100% seguro de que esta sea la verdadera razón por la que los desarrolladores de WP adoptaron este enfoque, pero el sentido común me dice que serializar conserva los tipos de variables y tiene una mini detección de errores incorporada, y json almacena solo valores de cadena { key : value }, así que cuando Regrese a PHP, tendrá que adivinar el formato o hacer un analizador para él. Esto lo obligará a tener dos formas diferentes de manejar sus datos: anterior, para almacenar los datos como json y después de decodificar el json, volverá como un objeto totalmente diferente.

Esta es la razón principal de la diferencia de tamaño, PHP está almacenando no solo una matriz; está almacenando cuántos elementos había en la matriz cuando se serializó, sus tipos y sus valores.

No está almacenando solo pares de valores clave en la base de datos, sino que también puede estar almacenando un objeto con diferentes tipos de variables.

Ramy Deeb
fuente
Me encanta la respuesta más. Puntos realmente útiles.
Mayeenul Islam
1
Atcutalmente, lo que suena tan positivo en esta respuesta con los datos buscados solo lo hace más complejo (e inseguro) que con una serialización más simple con JSON. Solo digo. La razón real es como se da en la otra respuesta de que cuando se introdujo la función, solo había la función de serialización de PHP, JSON aún no estaba allí.
Hakre
6

La codificación JSON se introdujo en PHP 5.2, WordPress es mucho más antiguo y nació (y está diseñado para) PHP 4.

La serialización de datos es algo generalizado en WordPress, por lo que pasar de la serialización PHP a la codificación JSON significaría un gran problema de compatibilidad con versiones anteriores, y si conozco un poco a WordPress, eso nunca sucederá.

Dicho esto, si crees que la codificación JSON es mejor para ti que la serialización PHP, simplemente úsala.

Si pasa una cadena (es decir, la versión codificada de JSON de sus datos) para publicar metafunciones, WordPress no la tocará, pero debe recordar decodificar los datos JSON al recuperarlos.

Si el tamaño de almacenamiento de la base de datos es muy importante para usted, probablemente valga la pena el trabajo adicional, de lo contrario, simplemente deje que WordPress use lo que usa y no se preocupe.

Tal vez, puede evaluar si es el caso de tablas personalizadas para guardar sus datos.

gmazzap
fuente
3

Estoy tentado a cerrar esto como "sujeto a opinión", pero creo que hay un par de buenas respuestas a la pregunta. Voy a ir con "historia".

1) json_encodees relativamente nuevo en el núcleo de PHP.

json_encode

(PHP 5> = 5.2.0, PECL json> = 1.2.0) json_encode - Devuelve la representación JSON de un valor

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

json_encodeno habría sido confiable en los primeros días de WordPress. Solo se incluyó en PHP "núcleo" en 5.2, aunque estaba disponible como una extensión PECL mucho antes.

En segundo lugar, si alimenta un objeto como un WP_Queryobjeto json_encode, obtiene un stdClassobjeto json_decode. serialize/ unserializepreservará el objeto.

s_ha_dum
fuente
+1. Pero me opongo "sujeto a opinión", porque adjunto pruebas. Y el último: problema relacionado con la clase: ya mencioné eso en el segundo enlace (razones por las que no json_encode).
Mayeenul Islam