Java'da Örneklerle Serileştirilebilir Arayüz
Yayınlanan: 2021-11-29Java, Serileştirilebilir arabiriminin bir olduğu birkaç paket sunar. Java paketi java.io içinde bulunur ve bir tür işaretleyici arabirimidir. Bir işaretleyici arabirimi olarak tanımlandığında, arabirimde hiçbir yöntem veya alan mevcut değildir. Bu nedenle, herhangi bir sınıf arabirimi uyguladığında, arabirimin herhangi bir yöntemi uygulaması gerekmez. Bir sınıf, örneklerinin serileştirilmesini veya seri durumdan çıkarılmasını istiyorsa, sınıflar arabirimi uygular.
Serileştirme mekanizması, bir nesne durumunun bir bayt akışına dönüştürülmesi için kullanılır. Bu mekanizma, ObjectOutputStream kullanılarak gerçekleştirilir. Seri durumdan çıkarma süreci, serileştirme sürecinin tam tersidir. Bu durumda, bayt akışı tekrar Java nesnesine dönüştürülür. ObjectInputStream, seri durumdan çıkarma için kullanılır.
İçindekiler
seri hale getirme
Herhangi bir nesnenin durumunun bir bayt akışına dönüştürülmesi, serileştirme olarak bilinir. Serileştirmenin tersi de serileştirmedir. Java'nın bir nesnesi, bir statik bayt akışına dönüştürülebilir. Bu statik akış daha sonra bir veritabanına kaydedilebilir veya farklı bir ağa da aktarılabilir. Serileştirme süreci örneğe bağlıdır. Bu, nesnelerin serileştirilmesinin bir platformda gerçekleştirilebileceği ve ardından nesnelerin seri hale getirilmesinin başka bir platformda gerçekleştirilebileceği anlamına gelir. Serileştirme işlemi için belirli bir işaretleyici arabirimi türü olan "Serializable" uygulanır. Bu nedenle, serileştirmeye uygun sınıflar, yani Java'daki seri hale getirilebilir sınıf , işaretleyici arabirimini uygulamalıdır.
Bir nesne durumunu bir bayt akışına yazma mekanizması, serileştirme olarak bilinir. Mekanizma öncelikle JMS, EJB, JPA, RMI ve Hibernate teknolojilerinde kullanılır.
ObjectInputStream ve ObjectOutputStream, java.io.InputStream ve java.io.OutputStream'i genişleten üst düzey sınıfların biçimleridir. İlkel türler ve nesne grafikleri, bir bayt cinsinden ObjectOutputStream tarafından OutputStream'e yazılabilir.
aktarım. Dönüştürmeden kaynaklanan akış, ObjectInputStream aracılığıyla okunabilir. Bu nedenle, serileştirme için ObjectOutputStream'den writeObject() yöntemi çağrılır ve seri durumdan çıkarma için ObjectInputStream sınıfından readObject() yöntemi çağrılır.
ObjectOutputStream'de en önemli olan yöntem şudur:
Yukarıdaki kod satırı https://www.baeldung.com/java-serialization adresinden alınmıştır.
Yukarıdaki kod satırında, seri hale getirilebilir bir nesne alınır ve ardından bir bayt akışına veya akışına dönüştürülür.
ObjectInputStream durumunda en kritik yöntem şudur:
Yukarıdaki kod satırı https://www.baeldung.com/java-serialization adresinden alınmıştır.
Yukarıdaki kod satırı, bayt dizisini okuyabilir ve bu bayt akışını bir Java nesnesine dönüştürebilir. Orijinal nesne bunun üzerinden geri alınabilir.
Serileştirme işleminin bir örneği aşağıda açıklanabilir:
Serileştirme için bir "Kişi" sınıfı düşünülür. Statik alanlar serileştirilmemiştir ve bazı sınıflara aittirler. Serileştirme sürecinde “transient” anahtar sözcüğü kullanılarak sınıf alanları yoksayılabilir.
Kaynak
Kişi tipinin nesnesi bir yerel dosyaya kaydedilebilir ve ardından değer tekrar okunur. Aşağıda gösterilen kod bu amaç için kullanılabilir.
ObjectOutputStream, FileOutputStream kullanılarak nesne durumunu bir dosyaya kaydetmek için kullanıldı. Bu örnekte, projenin dizininde “yourfile.txt” adlı bir dosya oluşturulmuştur. FileInputStream kullanılarak oluşturulan dosya yüklenir. Bu akış daha sonra ObjectInputStream tarafından alınır ve p2 adında yeni bir nesneye dönüştürülür. Yüklenen nesnenin durumu nihayet test edilir ve orijinal nesnenin durumu ile eşleştirilir. Yüklenen nesne, tipik bir kişiye açıkça gösterilmelidir.
Java serileştirmedeki uyarılar
1. Kalıtım ve Kompozisyon
Bir kullanıcı Java.io.Serializable arabirimini uyguladığında, arabirimi uygulayan tüm sınıf alt sınıfları serileştirilebilir hale gelir. Ayrıca, bir nesnenin farklı bir nesneye referansı varsa, arabirimi uygulamak için atıfta bulunulan nesneler ayrı ayrı serileştirilebilir; bu nesneler arayüzü uygulamazsa, bir istisna atılır. Atılan istisna NotSerializableException olacaktır. Ayrıca, bir dizi nesnenin serileştirilebilir bir nesnede depolandığını varsayalım, tüm dizi nesneleri serileştirilmelidir. Nesnelerin serileştirilmesi olmazsa, "NotSerializableException" istisnasını atar.
2. Seri Sürüm UID
Serileştirilebilir arabirimi uygulayan her sınıf için, sınıfların her biriyle bir sayı ilişkilendirilir. Numara, Java Sanal Makinesi ile ilişkilidir. Bu, esas olarak yüklenen ve kaydedilen nesnelerin tam niteliklere sahip olduğunu doğrulamak için yapılır. Yalnızca öznitelikler aynıysa, nesneler seri hale getirildikten sonra uyumlu olacaktır. IDE'ler bu sayıları otomatik olarak oluşturur ve esas olarak sınıfın adlarına, niteliklerine ve onunla ilişkili erişim değiştiricilerine dayanır. Değişikliklerden farklı bir sayı ortaya çıkarsa, "InvalidClassException" istisnası oluşturulur.
Bir serialVersionUID, seri hale getirilebilir bir sınıf tarafından bildirilmezse, JVM onu çalışma süresi boyunca otomatik olarak oluşturur. Sayı otomatik olarak oluşturulacak olsa da, sınıfların bir serialVersionUID bildirmesi önerilir. Bunun nedeni, otomatik olarak oluşturulacak serialVersionUID'nin derleyiciye bağımlı olması ve bazen beklenmedik InvalidClassException'lar oluşturabilmesidir.
3. Özel serileştirme
Nesneleri seri hale getirmek için Java'da varsayılan bir yol ayarlanmıştır. Java bu varsayılan davranışı geçersiz kılabilir. Özel serileştirme için bir yol var. Serileştirilemez özniteliklere sahip nesnenin serileştirilmeye çalışıldığı durumlarda özellikle yararlıdır. Bu tür nesneler için serileştirme, kullanıcının serileştirilmesini istediği bir sınıf içinde iki yöntemle yapılabilir. Bu iki yöntem şunlardır:
Yukarıdaki iki yöntem, öznitelikleri daha önce serileştirilemeyen, seri hale getirilebilecek herhangi bir formda seri hale getirmek için kullanılabilir.
Java'da serileştirmenin avantajları
Java'da serileştirmenin avantajlarından biri, bir nesnenin durumunun bir ağ üzerinde seyahat edilebilmesidir.
Java arabirimi java.io.Serializable
java.io.Serializable, arabirim içinde hiçbir yöntem ve nesne olmadığı anlamına gelen bir işaretleyici arabirimidir. İşaretleyici arayüzünün birincil işlevi,
sınıfların tüm nesnelerine belirli bir yetenek vermek için Java sınıfları. İşaretleyici arabirimlerinin örnekleri, Uzak ve Klonlanabilir'dir.
Arabirim, nesnelerini seri hale getirmek için arabirimi kullanan herhangi bir sınıf tarafından uygulanmalıdır. Varsayılan olarak, sarmalayıcı sınıfları ve String sınıfı gibi sınıflar, Java.io.Serializable arabirimini uygular.
Java seri hale getirilebilir bir örnek aşağıda gösterilmiştir.
Yukarıdaki kodda Student sınıfının Serializable arabirimini uyguladığı görülebilir. Bu nedenle sınıf, Serializable arabirimini uyguladığında, sınıf içindeki nesneler bayt akışına dönüştürülebilir.
ObjectOutputStream sınıfı
Bu sınıf, ilkel veri türlerini ve Java nesnelerini OutputStream'e yazmak için kullanılır. Java.io.Serializable arabirimini destekleyen nesne, akışlara yazmak için kullanılabilir.
ObjectInputStream sınıfı
ObjectOutputStream kullanılarak yazılan tüm ilkel veriler, ObjectInputStream kullanılarak seri durumdan çıkarılır.
Java'da Serileştirilebilir bir arabirim örneği aşağıda gösterilmiştir.
Bu örnekte, Student sınıfı seri hale getirilecek. ObjectOutputStream sınıfının writeObject() yöntemi, nesneleri seri hale getirmek için tüm işlevleri sağlar. Nesnenin durumu, f.txt adında bir dosyaya kaydedilir.
Sonuçlar
Makale Java'da serileştirme kavramını tartıştı. Bir sınıfın nesnelerini seri hale getirmek için gereken arayüzleri ve diğer önemli yöntemleri listeledi. Serileştirme süreci, her serileştirilebilir sınıfla her zaman bir kimlik veya bir sayı ile ilişkilendirilir. Bu numara, SerialVersionUID olarak adlandırılır. SerialVersionUID'nin ana kullanımı, seri hale getirilecek nesne için gönderici ve alıcıyı doğrulamaktır. Bunun nedeni, hem göndericinin hem de alıcının aynı olması gerektiğidir.
Java programlama dilinin önemli bir özelliğidir. Java'daki bu kadar önemli özellik ve kavramlar hakkında daha fazla bilgi edinmek ve programlama dili becerilerinizde ustalaşmak istiyorsanız upGrad tarafından sunulan Yazılım Mühendisliği Kurslarına göz atabilirsiniz. Çalışan bir profesyonel iseniz, kurs sizin için en uygun olanıdır. Her türlü soru için yardım ekibimizle iletişime geçilebilir. Ayrıca belirli kurs için web sitemize göz atabilir ve ayrıntılı bilgi alabilirsiniz. Serileştirilebilir arayüz, bir işaretleyici arayüzüdür. İşaretleyici arabirimi, Java çalışma zamanına, uygulayan sınıfın kendisinin serileştirilmesine izin verdiğine dair bir ipucu sağlar. Çalışma zamanı, nesneyi seri hale getirmek için bu arabirimden yararlanacaktır. Java'daki seri hale getirilebilir arabirim, Java'daki veri sınıfları tarafından uygulanacak özel bir arabirimdir. Bir sınıf bu arabirimi uyguladığında, bir veritabanında kalıcı olabilir. Bu arayüz java.io paketinde bildirilmiştir. Serileştirilebilir arabirimin iki yöntemi vardır: readResolve() ve writeReplace(), veritabanında nesne okumak ve yazmak için kullanılır. Java'da Serileştirilebilir arabirim uygulamak, Serileştirilebilir arabirime sahip herhangi bir sistemde serileştirilebilen ve seri hale getirilebilen bir nesneye sahip olmak anlamına gelir. Bu tür arabirimin uygulanması, sınıf harici olarak üçüncü taraf kitaplıkları (JSON, XML, vb.) veya ağ protokolleri tarafından serileştirildiğinde etkili olacaktır. Bir değişken Serileştirilebilir olarak bildirildiğinde, değişkenin her bir örneği, bir yönteme parametre olarak geçirilirse veya bir yöntemden döndürülürse seri hale getirilir ve seri durumdan çıkarılır. Serileştirme, program aracılığıyla gerçekleştirilir, böylece bir nesnenin durumu, daha sonra seri durumdan çıkarılması ve nesnenin kullanıcısına sunulması gerektiğinde korunabilir. Serileştirilmiş bir nesne, bir bayt akışı içeren bir nesnedir. Nesnenin yapıcısı veya writeObject() / readObject() yöntemleri, bayt akışını nesneye yerleştirmek için kullanılır. Depolanan veriler metin, ses, video veya herhangi bir özel uygulama verisi olabilir. Bu nesneler için veriler bir dosyada veya uzak bir sunucuda saklanabilir. Serileştirilmiş nesneleri ağ üzerinden aktarmak için RMI (Uzaktan Yöntem Çağırma) protokolü kullanılmalıdır. RMI, dağıtılmış uygulamalar oluşturmak için iyi bir protokoldür. İstemcinin, bir sunucu üzerinde çalışan bir Java uygulamasında nesneler üzerindeki yöntemlerle iletişim kurmasını sağlar. RMI protokolü bir Uzaktan Yordam Çağrısı (RPC) mekanizmasıdır. Java'da seri hale getirilebilir arayüz nedir?
Java'da Serileştirilebilir arabirim uygularsak ne olur?
Serileştirilmiş bir nesneyi ağ üzerinden aktarabilir miyiz?