Özel Serileştirme: writeObject ve readObject
Şifreleme, sıkıştırma veya özel alan işleme için writeObject ve readObject yöntemlerini geçersiz kılın.
Özel Serileştirme: writeObject ve readObject, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Varsayılan Serileştirme Yeterli Olmadığında
Varsayılan serileştirme, transient olmayan tüm alanları olduğu gibi kaydeder. Bazen şifrelemeye, sıkıştırmaya veya farklı bir gösterime ihtiyaç duyarsınız. Bu noktada writeObject / readObject kancaları devreye girer.
writeObject Bildirimi
Bir private void writeObject(ObjectOutputStream oos) yöntemi ekleyin. Java, varsayılan mekanizma yerine bu yöntemi çağırır. Tam olarak ne yazılacağını siz denetlersiniz.
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject(); // write non-transient fields normally
oos.writeUTF(encrypt(this.secret)); // write encrypted secret
}readObject Bildirimi
Bir private void readObject(ObjectInputStream ois) yöntemi ekleyin. Java, serileştirmeden çıkarma sırasında bu yöntemi çağırır. Verileri, yazdığınız sırayla tamamen aynı sırada okursunuz.
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
ois.defaultReadObject(); // restore non-transient fields
this.secret = decrypt(ois.readUTF()); // decrypt and restore
}Sıra Önemlidir
writeObject içinde ne yazarsanız readObject içinde aynı sırayla geri okumalısınız. Sıra uyuşmazlığı StreamCorruptedException oluşmasına neden olur.
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.writeInt(version);
oos.writeUTF(data);
}
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
this.version = ois.readInt(); // same order
this.data = ois.readUTF();
}Serileştirme Sırasında Verileri Sıkıştırma
Büyük alanları sıkıştırmak için writeObject içinde akışı GZIPOutputStream ile sarın; ardından sıkıştırmayı açmak için readObject içinde GZIPInputStream kullanın.
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try (GZIPOutputStream gz = new GZIPOutputStream(bos)) {
gz.write(largePayload.getBytes());
}
oos.writeObject(bos.toByteArray());
}readResolve Kancası
readResolve(), serileştirmeden çıkarma sonrasında çağrılır. Yerine geçecek bir nesne döndürün; serileştirmeden çıkarma sonrasında yalnızca bir örneğin bulunmasını sağlamak için tekil örneklerde ve numaralandırmalarda yararlıdır.
public class AppConfig implements Serializable {
private static final AppConfig INSTANCE = new AppConfig();
private AppConfig() {}
public static AppConfig getInstance() { return INSTANCE; }
private Object readResolve() { return INSTANCE; } // return singleton
}writeReplace Kancası
writeReplace(), serileştirmeden önce çağrılır. Bunun yerine serileştirilecek farklı bir nesne döndürün; vekil yaklaşımlarında ve serileştirme vekillerinde yararlıdır.
private Object writeReplace() {
return new UserProxy(this.id); // serialize a lightweight proxy
}readObject İçindeki Alanları Doğrulama
Derinlemesine savunma stratejisinin bir parçası olarak geçersiz veya değiştirilmiş verileri reddetmek için readObject içine doğrulama mantığı ekleyebilirsiniz.
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
ois.defaultReadObject();
if (age < 0 || age > 150) {
throw new InvalidObjectException("Invalid age: " + age);
}
}Sürüm Değişikliklerini Ele Alma
Geçişler sırasında readObject yönteminin hem eski hem de yeni biçimleri sorunsuz şekilde ele alabilmesi için writeObject içinde bir sürüm alanı kullanın.
private static final int SERIAL_VERSION = 2;
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
oos.writeInt(SERIAL_VERSION);
if (SERIAL_VERSION >= 2) oos.writeUTF(email); // new field
}
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
ois.defaultReadObject();
int v = ois.readInt();
if (v >= 2) this.email = ois.readUTF();
}Serileştirme Vekili Deseni
Sağlam bir yaklaşım, gerekli en az durumu yakalayan özel bir statik iç sınıf yazmak; ardından vekili yazmak için writeReplace ve asıl nesneyi yeniden oluşturmak için vekilin readResolve yöntemini kullanmaktır.
Performansla İlgili Hususlar
Özel serileştirme, yöntem çağrısı ek yükü getirir; ancak yük verisinin boyutunu önemli ölçüde azaltabilir. En iyi duruma getirmeden önce ölçüm yapın; en yüksek denetim için Externalizable kullanın.
Hızlı Kontrol
writeObject ve readObject içindeki sıra hakkında ne doğru olmalıdır?
Özet
Şifreleme, sıkıştırma veya özel biçimler için writeObject / readObject yöntemlerini geçersiz kılın. Tekil örnekler için readResolve kullanın. Her zaman yazdığınız sırayla okuyun.
Sıkça Sorulan Sorular
“Özel Serileştirme: writeObject ve readObject” dersi ücretsiz mi?
Evet — “Özel Serileştirme: writeObject ve readObject” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Özel Serileştirme: writeObject ve readObject” dersinde ne öğreneceğim?
Şifreleme, sıkıştırma veya özel alan işleme için writeObject ve readObject yöntemlerini geçersiz kılın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Özel Serileştirme: writeObject ve readObject” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Java Serileştirmesinin Temelleri
- transient Alanları ve serialVersionUID
- Özel Serileştirme: writeObject ve readObject
- Modern Alternatifler: JSON ve Protocol Buffers