Serialiseren of json in PHP?

Dus ik moet een array coderen in PHP en deze in platte tekst opslaan in de MySQL-database. Mijn vraag is of ik serialize() of json_encode() moet gebruiken? Wat zijn de voor- en nadelen van elk van hen?

Ik denk dat een van beide het zou doen in deze situatie. Maar welke zou jouw voorkeur hebben en waarom? Als het voor iets anders is dan een array?


Antwoord 1, autoriteit 100%

Belangrijkste voordeel van serialize: het is specifiek voor PHP, wat betekent dat het PHP-typen kan vertegenwoordigen, inclusief instanties van uw eigen klassen — en u krijgt uw objecten terug, nog steeds exemplaren van je klassen, bij het deserialiseren van je gegevens.

Belangrijkste voordeel van json_encode: JSON is niet specifiek voor PHP: er zijn bibliotheken om het in verschillende talen te lezen/schrijven — wat betekent dat het beter is als je iets wilt dat kan worden gemanipuleerd met een andere taal dan PHP.

Een JSON-string is ook gemakkelijker met de handte lezen/schrijven/aanpassen dan een geserialiseerde string.

Aan de andere kant, aangezien JSON niet specifiek is voor PHP, is het zich niet bewust van de dingen die specifiek zijn voor PHP, zoals datatypes.

Als een paar kanttekeningen:

  • Zelfs als er een klein verschil in snelheid is tussen die twee, zou het niet veel uit moeten maken: je zult waarschijnlijk niet veel data serialiseren/unserialiseren
  • Weet u zeker dat dit de beste manier is om gegevens in een database op te slaan?
    • Je zult niet veel query’s kunnen doen op geserialiseerde strins, in een DB: je zult je gegevens niet kunnen gebruiken in where-clausules, noch deze bijwerken zonder tussenkomst van PHP. ..

Antwoord 2, autoriteit 23%

Ik heb een analyse gemaakt van Json-codering versus serialisatie in PHP. En ik ontdekte dat Json het beste is voor duidelijke en eenvoudige gegevens zoals array.

Bekijk de resultaten van mijn experimenten op https ://www.shozab.com/php-serialization-vs-json-encoding-for-an-array/


Antwoord 3, autoriteit 15%

Een ander voordeel van json_encodeten opzichte van serializeis de grootte. Ik merkte dat terwijl ik probeerde uit te zoeken waarom ons memcachegebruikte geheugen zo groot werd, en ik probeerde manieren te vinden om het te verminderen:

<?php
$myarray = array();
$myarray["a"]="b";
$serialize=serialize($myarray);
$json=json_encode($myarray);
$serialize_size=strlen($serialize);
$json_size=strlen($json);
var_dump($serialize);
var_dump($json);
echo "Size of serialized array: $serialize_size\n";
echo "Size of json encoded array: $json_size\n";
echo "Serialize is " . round(($serialize_size-$json_size)/$serialize_size*100) . "% bigger\n";

Wat je geeft:

string(22) "a:1:{s:1:"a";s:1:"b";}"
string(9) "{"a":"b"}"
Size of serialized array: 22
Size of json encoded array: 9
Serialize is 59% bigger

Natuurlijk heb ik het meest extreme voorbeeld genomen, want hoe korter de array, hoe belangrijker de overhead met serialiseren (ten opzichte van de oorspronkelijke objectgrootte, vanwege de opmaak die een minimum aantal tekens oplegt, hoe klein de inhoud ook is) ). Nog steeds van een productiewebsite zie ik geserialiseerde arrays die 20% groter zijn dan hun json-equivalent.


Antwoord 4, autoriteit 10%

Ten eerste is het serialiseren van een array of object en het opslaan ervan in een database typisch een codegeur. Soms plaatsen mensen een door komma’s gescheiden lijst in een kolom en komen ze in allerlei problemen als ze er later achter komen dat ze er een vraag over moeten stellen.

Dus denk daar heel goed over na als dit zo’n situatie is.

Wat betreft de verschillen. PHP serialize is waarschijnlijk compacter, maar alleen bruikbaar met PHP. JSON is platformoverschrijdend en mogelijk langzamer te coderen en te decoderen (hoewel ik dat zeer betwijfel).


Antwoord 5, autoriteit 6%

Ten eerste dank aan Shozab Hasan en user359650 voor deze tests. Ik vroeg me af welke keuze de beste was en nu weet ik het:

Om een ​​eenvoudige array te coderen, JSON, wat in orde is met zowel PHP als javascript, misschien andere talen.

Om een ​​PHP-object te coderen, is serialiseren een betere keuze vanwege de specificiteit van PHP-objecten die alleen onstabiel zijn met PHP.

Als u gegevens wilt opslaan, slaat u gecodeerde gegevens op in een bestand of gebruikt u MySQL met standaardindeling. Het zou veel gemakkelijker zijn om uw gegevens terug te krijgen. MySQL heeft geweldige functies om gegevens te krijgen zoals u ze zou willen krijgen zonder PHP-behandeling.

Ik heb nog nooit een test gedaan, maar ik denk dat bestandsopslag de beste manier is om je gegevens op te slaan als het sorteren van systeembestanden voldoende is om je bestanden terug te krijgen in alfabetische/numerieke volgorde.
MySQL is te hebberig voor dit soort behandelingen en gebruikt ook een bestandssysteem…


Antwoord 6, autoriteit 4%

Als je data nooit je PHP-applicatie hoeft te verlaten, raad ik serialize() aan omdat het veel extra functionaliteit biedt, zoals __sleep() en __wakeup() methoden voor je objecten. Het herstelt ook objecten als instanties van de juiste klassen.

Als u de geserialiseerde gegevens doorgeeft aan een andere toepassing, moet u JSON of XML gebruiken voor compatibiliteit.

Maar een geserialiseerd object opslaan in een database? Misschien moet je daar nog eens over nadenken. Het kan later een groot probleem zijn.

Other episodes