Merhaba Arkadaşlar,
Bir önceki kod parçacığında geliştirici tanımlı bir sınıf koleksiyonunun JSON formatından nasıl serileştirilebileceğini incelemiştik. Ruby dilinde dahili(built-in) olarak gelen serileştirme kütüphaneleri de vardır(YAML ve Binary) Tahmin edeceğiniz üzere duruma göre bu serileştirme çeşitlerinden birisinin kullanılması tercih edilebilir. Aşağıdaki örnek kod parçacığında bu biçimdeki serileştirme ve ters-serileştirme işlemlerinin nasıl yapıldığı ele alınmaktadır.
# encoding: ISO-8859-9
require 'yaml'
=begin
YAML(Yet Another Markup Language) ve Binary Serileştirme
=end
class Product
attr_accessor :ID
attr_accessor :Title
attr_accessor :Price
attr_accessor :Measurement
def initialize(id,title,price,measure)
@id,@title,@price,@measure=id,title,price,measure
end
def to_s
"#{@id}-#{@title}(#{@price})#{@measure.to_s}"
end
end
class Measurement
attr_accessor :Type
attr_accessor :Unit
def initialize(type,unit)
@type,@unit=type,unit
end
def to_s
"[#{@type}:#{@unit}]"
end
end
if __FILE__==$0
pcMeasurement=Measurement.new "adet",1
pc=Product.new 1001,"EyçPi Pavilyon 2000",1500,pcMeasurement
mouseMeasurement=Measurement.new "adet",1
mouse=Product.new 2002,"Mikropsoft Wireless Mouse",50,mouseMeasurement
lgoMeasurement=Measurement.new "parça",845
lgo=Product.new 3045,"Lego Siti - Betmen",150,lgoMeasurement
basket=[pc,mouse,lgo]
yamlS=YAML::dump(basket)
yamlFile=File.new("Products.yaml","w")
yamlFile.syswrite yamlS
puts yamlS
yamlDs=YAML::load(yamlS)
puts "YAML Deserialized object's class type: #{yamlDs.class}"
puts yamlDs[2].to_s
binaryS=Marshal::dump(basket)
binaryFile=File.new("Products.bin","w")
binaryFile.syswrite binaryS
puts binaryS
binaryDs=Marshal::load(binaryS)
puts "Binary Deserialized object's class type: #{binaryDs.class}"
puts binaryDs[1].to_s
end
Uygulama içerisinde iki sınıf kullanılmaktadır. Product ve Measurement. Measurement sınıfı aynı zamanda Product sınıfı içerisindeki niteliklerden birisidir. Uygulama basit olarak Product tipinden bir diziyi ve elamanlarını, sırasıyla YAML ve Binary serileştirmeye tabii tutmaktadır. Sonuçlar Products.yaml ve Products.bin olarak aynı klasöre yazılmaktadır. Tamin edileceği üzere yaml uzantılı dosya içerisinde dizinin YAML formatında serileştirilmiş versiyonu bulunmaktadır. Bin uzantılı dosyada ise binary serileştirilmiş versiyonu. Programın çalışma zamanı çıktıları aşağıdaki gibidir.
Serileştirilen dosya içerikleri ise aşağıdaki gibidir.
Önce yaml içeriği
ve Binary versiyonu
Uygulamanın iki temel noktası vardır. YAML ve Binary tipteki serileştirme işlemleri Ruby içerisinde var olan modüllerden yararlanılarak gerçekleştirilir. Bu işlemler için YAML ve Marshal modüllerinden faydalanılmaktadır. Aslında serileştirme işlemi son derece basittir. Bunun için dump fonksiyonu kullanılır. Parametre olarak serileştirilmek istenen nesne örneği verilir. Ters serileştirme operasyonu içinse load metodundan yararlanılmaktadır. load metoduna serileştirilmiş içeriğin verilmesi yeterlidir.
Örnekte ters serileştirme operasyonu doğrudan serileştirilmiş tipler üzerinden yapılmıştır. (İlgilenen arkadaşlarımız isterlerse dosyalar içerisine serileştirilmiş içerikleri, yine dosyadan okuma suretiyle ters serileştirme işlemine tabi tutabilirler. Güzel bir antrenman olur)
Son iki yazıda ele aldığımız serileştirme teknikleri büyük çaplı projelerde oldukça önemlidir. Verilerin kalıcı olarak saklanması noktasında, nesnel içeriklerin insan gözüyle okunabilir olarak veya performans kriterleri gibi sebeplerden daha az yer tutacak şekilde saklayabilmek gerektiği noktalarda serileştirme vazgeçilmezlerdendir.
Üstelik JSON ve YAML gibi formatlar kürsel standartlardandır. Ön yüzlerde, servisler arası iletişimlerde, RESTFull modeldeki web sayfalarında ve pek çok noSql sisteminde JSON' un yeri vardır. Burada unutulan noktalardan birisi de XML serileştirmedir. Acaba Ruby ile bir nesne içeriğinin XML formatında serileştirilmesi mümkün müdür? Şu anda merak ettiğim bu konuyu ilerleyen zamanlarda araştırıyor olacağım. Böylece geldik bir kod parçacığımızın daha sonuna. Tekrardan görüşünceye dek hepinize mutlu günler dilerim. Tabii eğer böyle bir şey mümküse.
Kaynaklar
YAML Hakkında : https://en.wikipedia.org/wiki/YAML ve http://www.yaml.org/