La sérialisation est le processus de conversion d'un objet en un flux d'octets (ou en une chaîne) afin de le sauvegarder ou de le transmettre sur un réseau, tandis que la désérialisation est l'opération inverse.
Historiquement, le principal problème en Python a été la standardisation de l'échange de structures de données complexes entre différentes applications et langages. Pour cela, divers modules ont été introduits dans la bibliothèque standard : d'abord pickle pour la sérialisation de n'importe quel objet Python, puis json pour l'échange universel avec des systèmes externes.
Problème : pickle stocke des données spécifiques à Python, est dangereux (peut exécuter du code arbitraire lors du chargement) et n'est pas compatible avec d'autres langages, json — limité aux types simples (dict, list, str, int, float, bool et None), mais plus sûr et largement utilisé pour l'échange entre différentes technologies.
Solution : utiliser pickle uniquement pour des données de confiance entre les systèmes Python ; appliquer json pour l'échange avec des services externes, le développement web et la transmission de structures lisibles par l'homme.
Exemple de code :
import pickle import json data = {'a': [1, 2, 3], 'b': True} # Sérialisation avec pickle pickled = pickle.dumps(data) # octets unpickled = pickle.loads(pickled) print(unpickled) # Sérialisation avec json jsoned = json.dumps(data) # chaîne unjsoned = json.loads(jsoned) print(unjsoned)
Caractéristiques clés :
Peut-on transmettre des réponses HTTP API via pickle à des systèmes externes ?
Non ! pickle n'est pas un standard d'échange de données entre langages et est extrêmement dangereux : le chargement à partir de pickle peut exécuter du code étranger. json est beaucoup mieux pour les interactions externes.
Peut-on sérialiser des fonctions, des classes ou des fonctions lambda en json ?
Non. json ne fonctionne qu'avec des types primitifs ; ni le json standard ni la plupart des analyseurs ne sérialisent les fonctions et les classes.
pickle peut-il sérialiser des objets avec des références cycliques ?
Oui, pickle gère automatiquement la plupart des références cycliques, y compris les structures récursives. Pour json, cela est généralement une erreur fatale.
Cas négatif : Transmission d'objets pickle à des applications clientes pour l'échange de données.
Avantages : mise en œuvre simple, tous les types Python sont préservés.
Inconvénients : extrêmement dangereux, impossible d'interagir avec d'autres langages.
Cas positif : Envoi de données via json, conversion de types non standards à l'aide d'encodeurs.
Avantages : sécurité, compatibilité, flexibilité.
Inconvénients : limitation des types pris en charge, nécessite parfois un encodeur/décodeur personnalisé.