"Bugün nesneleri bir dosyaya kaydetmeyi ve bir dosyadan okumayı incelediğimizi hatırlayacaksınız?"

"Evet, az önce bir giriş akışından okunan bir çıktı akışına kaydettik."

"Aferin Amigo. Bu ayrıntıları fark ettiğini duymak güzel. Kodu bir dosyaya kaydedecek ve dosyadan okuyacak şekilde tamamlayabilir misin?"

"Neyi tamamla?! Bir FileInputStream ve FileOutputStream bildirin ve bunları kaydetme ve yükleme yöntemlerine iletin. Burada kafa karıştıracak bir şey yok. Çok basit."

"Senin adına sevindim. Şimdi yeni bir konuya geçelim: serileştirme ."

Serileştirme az önce yaptığımızla hemen hemen aynı, ancak çok daha havalı ve doğrudan Java makinesinde yerleşik. Java makinesi nesnelerini saklayabilir ve yükleyebilir. Bunu yapmak için kaydetme ve yükleme yöntemlerine bile ihtiyacı yok: Tüm nesneler Java makinesinde saklanır ve onlara tam erişime sahiptir."

Sadece nesneyi alıp bir akışa kaydediyoruz ve bir akıştan okuyoruz:

kod
public static void main(String[] args) throws Exception
{
 Cat cat = new Cat();

 //Save a cat to file
 FileOutputStream fileOutput = new FileOutputStream("cat.dat");
 ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
 outputStream.writeObject(cat);
 fileOutput.close();
 outputStream.close();

 //Load a cat from file
 FileInputStream fiStream = new FileInputStream("cat.dat");
 ObjectInputStream objectStream = new ObjectInputStream(fiStream);
 Object object = objectStream.readObject();
 fiStream.close();
 objectStream.close();

 Cat newCat = (Cat)object;
}

"Bu kadar?"

"Kesinlikle. Bir akışa kaydetmemizi ve hemen hemen her veri türünden bir akıştan okumamızı sağlayan çok büyük ve karmaşık bir serileştirme mekanizması var ."

"Neredeyse hiç. Yani herhangi bir veri türü yok mu?"

"Evet, gerçek şu ki, tüm nesnelerin doğaları gereği kaydedilme yeteneği yoktur . Bazı nesneler tüm verilerini dahili olarak depolamaz. Bunun yerine yalnızca diğer nesnelere ve/veya veri kaynaklarına başvururlar. Örneğin, konsol (System. in), bir giriş akışı (InputStream) ve diğer şeyler."

Bu nedenle Java'nın yaratıcıları özel Seri hale getirilebilir arabirim işaretçisini buldular . Herhangi bir veri ve yöntem içermediği için işaretleyici olarak adlandırılır . Yalnızca sınıfları "etiketlemek" veya "işaretlemek" için kullanılır. Sınıfımızın tüm verilerini dahili olarak sakladığına inanıyorsak, onu implements Serializable ile işaretleyebiliriz .

İşte serileştirme desteği olan bir «cat» örneği:

kod
class Cat implements Serializable
{
 public String name;
 public int age;
 public int weight;
}

Bir nesneyi serileştirmeye (kaydetmeye) çalıştığımızda, Java makinesi serileştirmeyi destekleyip desteklemediğini kontrol eder: Seri hale getirilebilir arabirimi uyguluyor mu? Varsa, nesneyi kaydeder. Değilse, serileştirmenin imkansız olduğunu belirtmek için bir istisna atar.
Burada, serileştirilebilir bir nesnenin yalnızca serileştirilebilir nesnelerden oluşması gerektiğini anlamanız gerekir.

"Eh, bu mantıklı. Parçalarını kurtarmadan bütünü kurtaramazsın."

"Kesinlikle."

"Peki ya ints, Strings ve ArrayLists?"

"Hepsi serileştirmeyi destekliyor. Java'nın yaratıcıları bunun olmasını sağlamak için özel bir özen gösterdi. Burada herhangi bir sorun olmaması gerekir."

Ayrıca, nesne serileştirildiğinde nesnenin türü de kaydedilir. Artık bir Cat nesnesine referansı bir Object değişkenine kaydedebilirsiniz. Her şey seri hale getirilecek ve seri hale getirilecek.

"Seriden çıkarmak mı?"

" Serileştirmeyi kaldırma, serileştirmeyi tersine çevirme işlemidir: bir akıştan/dosyadan bir nesneyi okuma ve yeniden oluşturma."

"Ah, o zaman başka soru yok."