Serileştirme, bir nesneyi bir bayt akışına (veya bir dizeye) dönüştürme sürecidir, bu sayede onu saklayabilir veya ağ üzerinden iletebiliriz, serileştirme ise bu işlemin tersidir.
Tarihsel olarak Python'da temel sorun, farklı uygulamalar ve diller arasında karmaşık veri yapılarının standartlaştırılmasıydı. Bunun için standart kütüphanede çeşitli modüller ortaya çıktı: öncelikle herhangi bir Python nesnesinin serileştirilmesi için pickle, daha sonra ise dış sistemlerle evrensel veri alışverişi için json.
Sorun: pickle, Python'a özgü verileri saklar, güvensizdir (yükleme sırasında rastgele kod çalıştırabilir) ve diğer dillerle uyumlu değildir, json ise basit türlerle sınırlıdır (dict, list, str, int, float, bool ve None), ancak daha güvenlidir ve farklı teknolojiler arasında yaygın olarak kullanılır.
Çözüm: pickle'i yalnızca Python sistemleri arasında güvenilir veriler için kullanın; json'u dış hizmetlerle, web geliştirmede ve insan tarafından okunabilir veri yapıları aktarımında kullanın.
Kod örneği:
import pickle import json data = {'a': [1, 2, 3], 'b': True} # pickle ile serileştirme pickled = pickle.dumps(data) # bayt unpickled = pickle.loads(pickled) print(unpickled) # json ile serileştirme jsoned = json.dumps(data) # dize unjsoned = json.loads(jsoned) print(unjsoned)
Anahtar özellikler:
pickle ile HTTP API aracılığıyla dış sistemlere yanıt gönderebilir miyiz?
Hayır! pickle, diller arasında veri alışverişi için bir standart değildir ve son derece güvensizdir: pickle'den yükleme yapmak, dış kodu çalıştırabilir. json, dış etkileşimler için çok daha iyidir.
Fonksiyonları, sınıfları veya lambda fonksiyonlarını json ile serileştirmek mümkün mü?
Hayır. json yalnızca ilkel türlerle çalışır; standart json veya çoğu ayrıştırıcı, fonksiyonları ve sınıfları serileştirmez.
pickle döngü bağlantılarına sahip nesneleri serileştirebilir mi?
Evet, pickle çoğu döngü bağlantısını otomatik olarak işler, rekürsif yapılara kadar. json'da bu genellikle ölümcül bir hata olur.
Olumsuz durum: veri alışverişi için istemci uygulamalarına pickle nesneleri iletmek.
Artıları: basit uygulama, tüm Python türleri korunur.
Eksileri: kritik düzeyde tehlikeli, diğer dillerle etkileşim mümkün değildir.
Olumlu durum: json ile veri gönderimi, özel türleri kodlayıcılar aracılığıyla dönüştürmek.
Artıları: güvenlik, uyumluluk, esneklik.
Eksileri: desteklenen türler açısından sınırlama, bazen özel kodlayıcı/ayrıştırıcı gerektirir.