Sorunun Tarihçesi
Seri hale getirme ve deserilize etme, entegrasyonların artması, uygulamalar arasında karmaşık yapıların değiş tokuşu gereksinimi ve bunların dosyalarda veya veritabanlarında saklanması ihtiyacı ile birlikte güncel bir konu haline geldi. Perl, temel olarak entegre Storable, Data::Dumper ve JSON::XS, ayrıca YAML::XS ve kendi metin protokolleri gibi farklı seri hale getirme yaklaşımları sunar.
Problemi
Her mekanizmanın kendi kısıtlamaları ve nüansları vardır: Storable — daha hızlıdır ancak farklı mimariler arasında zayıf taşınabilirlik sunar; Data::Dumper — hata ayıklama için kullanışlıdır ancak nesneleri eski biçiminde geri getirme garantisi vermez; JSON modülleri — dış dillerle uyumludur, ancak referansları ve karmaşık Perl nesnelerini desteklemez. Bazı seri hale getirme araçları, glosari, closure'lar ile çalışamaz, hepsi döngüler/reklamla temiz bir yapıyı geri getiremez.
Çözüm
Seçim, amaca bağlıdır: eğer öncelik hızsa, Storable optimal bir çözüm olacaktır. Dış sistemlerle entegrasyonlar için JSON veya YAML kullanılır. Perl programının durumu saklama amaçları için — Data::Dumper. Akışlı seri hale getirme için — unicode ve encode destekleyen daha modern CPAN modülleri.
Kod Örneği:
use Storable qw(store retrieve); my $data = {foo => [1,2,3], bar => {baz => 'qux'}}; store($data, "datafile"); my $restored = retrieve("datafile");
Anahtar Özellikler:
Storable veya Data::Dumper ile closure'lar veya anonim sub'ları seri hale getirmek mümkün mü?
Hayır. Modüller kodun, closure'ların, dosya tanımlayıcılarının seri hale getirilmesini desteklemez. Bu tür denemeler hata verecek veya yapının bir kısmının kaybına yol açacaktır.
Data::Dumper ile seri hale getirme her hizmette güvenli ve hatasız mıdır?
Hayır. Data::Dumper Perl kodu üretir, eval üzerinden çalıştırılması, eğer veriler güvenilir bir kaynaktan yükleniyorsa, güvenlik açıklarına yol açabilir. Üretimde kod yürütmeyen formatlar kullanmak daha iyidir.
Storable, Perl sürümleri arasında uyumluluk sağlar mı ve çoklu platformda geçerli midir?
Kısmen. Storable, farklı mimariler (big-endian/little-endian) ve Perl sürümleri arasında ikili dosyaların taşınabilirliğini garanti etmez. Çoklu platformluluk için freeze/thaw ve manuel kontrol ile ikili mod kullanın.
Veriler (karmaşık yapı) Data::Dumper ile seri hale getirildi ve veritabanına eklendi. Diğer bir Perl sürümünde deserilize etme girişiminde hatalar oluştu, yapının bir kısmı kayboldu.
Artıları:
Eksileri:
JSON::XS'in hizmetler arası veri seri hale getirmede ve iç, geçici saklamalar için Storable'ın kullanılması. Deserilize etme yalnızca şema doğrulamasından sonra, eval olmadan gerçekleşti.
Artıları:
Eksileri: