Warum wählt WordPress die Datenserialisierung anstelle von json_encode?

13

In meinem kleinen Alter mit WordPress habe ich gesehen, dass WordPress selbst und seine benutzerfreundlichen Plugins serialize()in vielen Fällen PHP zum Speichern von Daten in db verwenden. Aber bei einer kürzlich durchgeführten Suche habe ich eine ernsthafte Unterstützung der Community für das json_encode()Internet gefunden serialize().

Und ich persönlich habe mit beiden ein assoziatives Array getestet, das Folgendes zeigt:

  • serialize() speichert 342 Zeichen
  • json_encode() speichert 285 Zeichen

Warum frage ich das?

Ich arbeite an einem Projekt, während ich wiederkehrende Metafelder in einem Beitrag speichern werde. Wo:

  • Die Daten sind grundsätzlich in Englisch, können aber auch in Bengali vorliegen
  • Die Daten wären assoziative Arrays mit einer Tiefe von 3 Ebenen (ich hoffe, ich habe die Ebenen richtig verstanden ):
array(
    1 => array(
        'key'=>'value',
        'key2'=>'value'
    ),
    2 => array(
        'key'=>'value',
        'key2'=>'value'
    )
)

Ich habe postmetadas meta_valueFeld der Tabelle überprüft, es ist ein longtext, das bedeutet eine Länge von 4.294.967.295 Zeichen (4 GB).

Also brauche ich eine robuste Lösung für die Aufbewahrung.

Mayeenul Islam
quelle
Mit einem Wort, Vermächtnis. WordPress ist älter als die weit verbreitete Übernahme von JSON, und als Folge davon hängen Tonnen von Websites von der API ab. Daher ist es hier, um neue Entwickler zu verwirren, die nicht lesen, dass es veraltet ist ....
Nate Symer

Antworten:

13

Ich denke, nicht 100% sicher , dass dies der wahre Grund für den WP - Entwickler diesen Ansatz nahm, aber die gesunde Menschenverstand sagt mir , dass serialize bewahrt die Variablentypen und hat eine Mini bei der Fehlererkennung gebaut und json speichert nur Werte Zeichenfolge { key : value }, so dass , wenn Sie Gehen Sie zurück zu PHP. Sie müssen das Format erraten oder einen Parser dafür erstellen. Dies zwingt Sie dazu, auf zwei verschiedene Arten mit Ihren Daten umzugehen: Vorherige, Speichern der Daten als json und nach dem Dekodieren des json wird es als ein völlig anderes Objekt zurückgegeben.

Dies ist der Hauptgrund für den Unterschied in der Größe, PHP speichert nicht nur ein Array; Es speichert, wie viele Elemente im Array waren, als es serialisiert wurde, ihre Typen und ihre Werte.

Sie speichern nicht nur Schlüsselwertpaare in der Datenbank, sondern möglicherweise auch ein Objekt mit unterschiedlichen Variablentypen.

Ramy Deeb
quelle
Ich liebe die Antwort am meisten. Wirklich hilfreiche Punkte.
Mayeenul Islam
1
Was in dieser Antwort mit den searialisierten Daten positiv klingt, macht sie natürlich nur komplexer (und unsicherer) als mit einer einfacheren Serialisierung mit JSON. Ich sage nur. Tatsächlicher Grund ist, wie in der anderen Antwort angegeben, dass es zum Zeitpunkt der Einführung des Features nur die PHP-Serialisierungsfunktion gab, JSON war noch nicht da.
Hakre
6

Die JSON-Codierung wurde in PHP 5.2 eingeführt, WordPress ist viel älter und wurde für PHP 4 entwickelt.

Die Serialisierung von Daten ist in WordPress allgegenwärtig. Ein Wechsel von der PHP-Serialisierung zur JSON-Codierung würde daher ein großes Abwärtskompatibilitätsproblem bedeuten. Wenn ich WordPress ein wenig kenne, wird dies niemals passieren.

Wenn Sie jedoch der Meinung sind, dass die JSON-Codierung für Sie besser ist als die PHP-Serialisierung, verwenden Sie sie einfach.

Wenn Sie eine Zeichenfolge (das ist die JSON-codierte Version Ihrer Daten) zum Posten von Metafunktionen übergeben, wird WordPress diese nicht berühren, Sie müssen jedoch beim Abrufen daran denken, die Daten mit JSON zu decodieren.

Wenn die Größe des DB-Speichers für Sie sehr wichtig ist, ist es wahrscheinlich die zusätzliche Arbeit wert. Andernfalls lassen Sie WordPress einfach das verwenden, was es verwendet, und kümmern sich nicht darum.

Vielleicht können Sie auswerten, ob es sich um benutzerdefinierte Tabellen handelt, um Ihre Daten zu speichern.

gmazzap
quelle
3

Ich bin versucht, dies als "vorbehaltlich der Meinung" zu schließen, aber ich denke, es gibt ein paar gute Antworten auf die Frage. Ich werde mit "Geschichte" gehen.

1) json_encodeist im PHP-Kern relativ neu.

json_encode

(PHP 5> = 5.2.0, PECL json> = 1.2.0) json_encode - Gibt die JSON-Darstellung eines Werts zurück

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

json_encodewäre in den Anfängen von WordPress nicht zuverlässig gewesen. Es wurde nur in "Kern" PHP in 5.2 gerollt, obwohl es lange vorher als PECL-Erweiterung verfügbar war.

Zweitens, wenn Sie ein Objekt wie ein WP_QueryObjekt json_encodeeinspeisen, bekommen Sie ein stdClassObjekt auf json_decode. serializeIch unserializewerde das Objekt erhalten.

s_ha_dum
quelle
+1. Aber ich widerspreche "der Meinung", weil ich Beweise beigefügt habe. Und das letzte: klassenbezogenes Problem: Ich habe das bereits beim zweiten Link erwähnt (Gründe warum nicht json_encode).
Mayeenul Islam