Maison développement back-end tutoriel php PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析

PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析

Dec 20, 2016 pm 03:35 PM
序列化

本文实例讲述了PHP中SERIALIZE和JSON的序列化与反序列化操作区别。分享给大家供大家参考,具体如下:

PHP中SERIALIZE和JSON序列化与反序列化区别是什么呢,对于这个问题我们可以和小编一起来看看,具体的操作细节如下所示。

在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢?

假设一个对象和一个数组:

$web = new stdClass;
$web->site = 'tantengvip';
$web->owner = 'tuntun';
$web->age = 5;
//和
$web = array();
$web['site'] = 'tantengvip';
$web['owner'] = 'tuntun';
$web['age'] = 5;
Copier après la connexion

对它们分别用serialize函数和unserialize函数进行序列化和反序列化,看看打印结果分别是什么,如下:

使用serialize方式:

var_dump(serialize($web));
var_dump(unserialize(serialize($web)));
var_dump(json_encode($web));
var_dump(json_decode(json_encode($web)));
Copier après la connexion

结果:

string 'O:8:"stdClass":3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}' (length=87)
object(stdClass)[127]
 public 'site' => string 'tantengvip' (length=10)
 public 'owner' => string 'tuntun' (length=6)
 public 'age' => int 5
string '{"site":"tantengvip","owner":"tuntun","age":5}' (length=46)
object(stdClass)[127]
 public 'site' => string 'tantengvip' (length=10)
 public 'owner' => string 'tuntun' (length=6)
 public 'age' => int 5
Copier après la connexion

使用json方式:

var_dump(serialize($web));
var_dump(unserialize(serialize($web)));
var_dump(json_encode($web));
var_dump(json_decode(json_encode($web),true));
Copier après la connexion

结果:

string 'a:3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}' (length=74)
array (size=3)
 'site' => string 'tantengvip' (length=10)
 'owner' => string 'tuntun' (length=6)
 'age' => int 5
string '{"site":"tantengvip","owner":"tuntun","age":5}' (length=46)
array (size=3)
 'site' => string 'tantengvip' (length=10)
 'owner' => string 'tuntun' (length=6)
 'age' => int 5
Copier après la connexion

我们发现,对于前面定义的这样一个对象或数组,用serialize和json进行序列化,反序列化回来的结果和原来是一样的,并没有什么区别,除了序列化的格式不同而已.

那么它们到底有何区别?以下文字总结很好,就不自己加以说明了,可以写代码验证。

使用json序列化和反序列化

优势:

变量序列化后依然可读

可以给其他系统使用,因为JSON格式是标准的

劣势:

只对UFT-8的数据有效,其他编码可能不能很好工作

只对stdClass类的示例有效

使用serialize方式序列化和反序列化

优势:

允许非UTF-8的变量

支持除了stdClass 示例外的其他实例

劣势:

编码后的文本对人来说是不可读的

无法被其他语言的系统引用

好,写个代码看看:

class Test
{
  private $pri = 'pri';
  public $class = 'Test';
  public function __construct()
  {
    $this->class = 'Test construct';
    $this->pri = 'pri construct';
  }
}
$test = new Test();
var_dump(serialize($test));
var_dump(unserialize(serialize($test)));
var_dump(json_encode($test));
var_dump(json_decode(json_encode($test)));
Copier après la connexion

结果:

string 'O:4:"Test":2:{s:9:"�Test�pri";s:13:"pri construct";s:5:"class";s:14:"Test construct";}' (length=86)
object(Test)[127]
 private 'pri' => string 'pri construct' (length=13)
 public 'class' => string 'Test construct' (length=14)
string '{"class":"Test construct"}' (length=26)
object(stdClass)[127]
 public 'class' => string 'Test construct' (length=14)
Copier après la connexion

我们发现,json序列化和反序列化丢失了类中的私有成员变量,而serialize序列化和反序列化只要是类的变量都可以,但是类的成员方法都无法进行序列化和反序列化。

在一般情况,还是使用json比较好,因为json是跨平台的通用格式,除了json,用xml也比较好。那在什么时候使用serialize方式呢?

在对一个类进行serialize反序列化的时候会默认调用魔术方法__wakeUp(),这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。那就是另外一个问题了,这里不做深究了

希望本文所述对大家PHP程序设计有所帮助。

更多PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析相关文章请关注PHP中文网!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

En Java, comment sérialiser une liste d'objets en utilisant flexjson ? En Java, comment sérialiser une liste d'objets en utilisant flexjson ? Sep 05, 2023 pm 11:09 PM

Flexjson est une bibliothèque légère permettant de sérialiser et de désérialiser des objets Java vers et depuis le format JSON. Nous pouvons sérialiser une liste d'objets en utilisant la méthode serialize() de la classe JSONSerializer. Cette méthode effectue une sérialisation superficielle sur l'instance cible. Nous devons passer une liste d'objets de type liste en paramètre à la méthode serialize(). Exemple de syntaxe publicStringserialize(Objecttarget) importflexjson.JSONSerializer;importjava.util.*;publicclassJsonSerial

Comment la sérialisation Java affecte-t-elle les performances ? Comment la sérialisation Java affecte-t-elle les performances ? Apr 16, 2024 pm 06:36 PM

L'impact de la sérialisation sur les performances Java : le processus de sérialisation repose sur la réflexion, ce qui affectera considérablement les performances. La sérialisation nécessite la création d'un flux d'octets pour stocker les données d'objet, ce qui entraîne des coûts d'allocation de mémoire et de traitement. La sérialisation d'objets volumineux consomme beaucoup de mémoire et de temps. Les objets sérialisés augmentent la charge lorsqu'ils sont transmis sur le réseau.

Comment sérialiser l'ordre des propriétés à l'aide de la bibliothèque Jackson en Java ? Comment sérialiser l'ordre des propriétés à l'aide de la bibliothèque Jackson en Java ? Aug 28, 2023 pm 12:45 PM

@JsonPropertyOrder est une annotation utilisée au niveau de la classe. Il prend comme attribut une liste de champs qui définit l'ordre dans lequel les champs apparaissent dans la chaîne générée par la sérialisation JSON de l'objet. Les propriétés incluses dans la déclaration d'annotation peuvent être sérialisées en premier (dans l'ordre dans lequel elles sont définies), suivies de toutes les propriétés non incluses dans la définition. Syntaxe public@interfaceJsonPropertyOrder Exemple importcom.fasterxml.jackson.core.*;importcom.fasterxml.jackson.databind.*;importcom.fasterxml.jac

Comment sérialiser une carte à l'aide de la bibliothèque flexjson en Java ? Comment sérialiser une carte à l'aide de la bibliothèque flexjson en Java ? Aug 26, 2023 pm 08:13 PM

Flexjson est une bibliothèque légère permettant de sérialiser et de désérialiser des objets Java vers et depuis le format JSON. Nous pouvons également sérialiser une Map en utilisant la méthode serialize() de la classe JSONSerializer, qui effectue une sérialisation superficielle sur l'instance cible. Exemple de syntaxe publicStringserialize(Objecttarget) importflexjson.JSONSerializer;importjava.util.*;publicclassJsonSerializeMapTest{ publ

Comment la bibliothèque de fonctions C++ effectue-t-elle la sérialisation et la désérialisation ? Comment la bibliothèque de fonctions C++ effectue-t-elle la sérialisation et la désérialisation ? Apr 18, 2024 am 10:06 AM

Guide de sérialisation et de désérialisation de la bibliothèque C++ Sérialisation : création d'un flux de sortie et conversion au format d'archive. Sérialisez les objets dans l'archive. Désérialisation : crée un flux d'entrée et le restaure à partir du format d'archive. Désérialisez les objets de l'archive. Exemple pratique : Sérialisation : Création d'un flux de sortie. Créez un objet d'archive. Créez et sérialisez des objets dans l'archive. Désérialisation : créez un flux d'entrée. Créez un objet d'archive. Créez des objets et désérialisez-les à partir de l'archive.

Compétences en traitement de données PHP : comment utiliser les fonctions de sérialisation et de désérialisation pour implémenter la sérialisation et la désérialisation des données Compétences en traitement de données PHP : comment utiliser les fonctions de sérialisation et de désérialisation pour implémenter la sérialisation et la désérialisation des données Jul 29, 2023 am 10:49 AM

Compétences en traitement de données PHP : Comment utiliser les fonctions de sérialisation et de désérialisation pour implémenter la sérialisation et la désérialisation des données. La sérialisation et la désérialisation sont l'une des compétences de traitement de données couramment utilisées en informatique. En PHP, nous pouvons utiliser les fonctions serialize() et unserialize() pour implémenter des opérations de sérialisation et de désérialisation de données. Cet article vous donnera une introduction détaillée sur la façon d'utiliser ces deux fonctions et fournira des exemples de code pertinents. 1. Qu'est-ce que la sérialisation et la désérialisation dans la programmation informatique ?

Sérialisation et désérialisation d'interfaces et de classes abstraites en Java Sérialisation et désérialisation d'interfaces et de classes abstraites en Java May 02, 2024 am 08:33 AM

Les interfaces ne peuvent pas être sérialisées directement. Les classes abstraites peuvent être sérialisées, mais seulement si elles ne contiennent pas de champs non statiques et non transitoires ou si elles ne remplacent pas les méthodes writeObject() et readObject(). Des instances spécifiques peuvent être implémentées via des classes concrètes qui implémentent l'interface. ou remplacez writeObject() et readObject, implémentation de la classe abstraite de la méthode ().

Sérialisation et désérialisation des types de fonctions Golang Sérialisation et désérialisation des types de fonctions Golang Apr 29, 2024 am 08:15 AM

Les types de fonctions GoLang peuvent être sérialisés et désérialisés via le package encoding/gob. Sérialisation : enregistrez un type personnalisé et utilisez gob.NewEncoder pour coder le type de fonction dans un tableau d'octets. Désérialisation : utilisez gob.NewDecoder pour désérialiser les types de fonctions des tableaux d'octets.

See all articles