Java serileştirme - avantajları ve dezavantajları, kullanın veya kaçının? [kapalı]


20

Serileştirme Java'da kalıcılık için kullanılır. Serileştirmeyi kullanarak birkaç nesneyi devam ettirmek uygun olabilir. Ancak, çok sayıda nesne için ORM, Veritabanı vb. Daha iyi olabilir. Serileştirmenin sadece küçük işler için yararlı olduğu görülmektedir. Belki hatalıyım. Öyleyse lütfen serileştirmenin serileştirme yöntemlerine göre avantajları nelerdir? Ne zaman kullanılmalı ve ne zaman kullanılmamalıdır?

Bu soru, DZone'un Nesne Serileştirmesi Kötü mü? Makalesini gördükten sonra aklıma geldi.

Ve bunlar soruma yol açan çizgiler:

Java ve onun oturum nesnelerine bakarsanız, saf nesne serileştirmesi kullanılır. Bir uygulama oturumunun oldukça kısa ömürlü olduğu varsayılarak, en fazla birkaç saat içinde, nesne serileştirmesi basittir, iyi desteklenir ve bir oturumun Java kavramı içinde yerleşiktir. Ancak, veri kalıcılığı uzun bir süre, muhtemelen günler veya haftalar boyunca olduğunda ve uygulamanın yeni sürümleri hakkında endişelenmeniz gerektiğinde, serileştirme hızla kötüleşir. İyi bir Java geliştiricisinin bildiği gibi, bir nesneyi bir oturumda bile serileştirmeyi planlıyorsanız, sadece 1L'ye değil, gerçek bir serileştirme kimliğine (serialVersionUID) ihtiyacınız var ve Serializable arabirimini uygulamanız gerekir. Ancak, çoğu geliştirici Java serileştirme sürecinin arkasındaki gerçek kuralları bilmiyor. Nesneniz değiştiyse, sadece nesneye basit alanlar eklemekten daha fazlası, serileştirme kimliği değişmese bile Java'nın nesnenin serisini doğru şekilde kaldıramaması mümkündür. Aniden, verilerinizi artık alamazsınız, bu da doğal olarak kötüdür.

Şimdi, bunu okuyan geliştiriciler, bu soruna sahip olacak kodu asla yazamayacaklarını söyleyebilirler. Bu doğru olabilir, ancak kullandığınız bir kütüphane veya şirketiniz tarafından artık kullanılmayan başka bir geliştirici ne olacak? Bu sorunun asla olmayacağını garanti edebilir misiniz? Bunu garanti etmenin tek yolu farklı bir serileştirme yöntemi kullanmaktır.


Belirtilen makalede özellikle sorunuza neden olan şeyi biraz genişletmek ister misiniz?
gnat

@gnat - soruya satır ekledi.
gökyüzü kazıyıcı

'Sadece a 1Ldeğil' bölümü doğru değil.
user207421

Yanıtlar:


15

Serileştirme çoğunlukla iki alanda kullanılır:

  • kalıcılığın prototiplenmesi

    hemen hemen her nesne grafiği hızlı bir şekilde serileştirilebilir hale getirilebilir, hızlı kavram kanıtı veya hızlı ve kirli uygulamalar için bu gerçek bir ORM katmanı veya diğer kalıcılık sistemi kurmaktan daha hızlı olabilir

  • neredeyse keyfi nesnelerin kısa süreli depolanması:

    Örneğin, uygulama sunucuları, serileştirme kullanarak oturum bilgilerini sürdürme eğilimindedir. Bunun avantajı, oturumdaki değerlerin hemen hemen her tür olabilmesidir (serileştirilebilir olduğu sürece).

Hemen hemen tüm diğer kullanımlar için sizin ve makalenizin bahsettiği dezavantajlar çok büyüktür: kesin formatın sabit kalması zordur, sınıf değişiklikleri seri hale getirilmiş verilerinizi kolayca okunamaz hale getirebilir, Java dışı koddaki verileri okumak / yazmak neredeyse imkansız (veya en azından gerekenden çok daha zor).

JAXB ve benzeri teknolojiler benzer işlevleri düşük maliyetle sağlarken, bazı sorunları azaltır.


JAXB 'düşük maliyetli' demezdim - şema yazılmalıdır.
kevin cline

3
@kevincline: JAXB ile bir şemaya ihtiyacınız yoktur, tamamen isteğe bağlıdır (ve isterseniz sınıflarınızdan da oluşturabilirsiniz). Ayrıca: JAXB herhangi bir nedenden dolayı kullanışlı değilse, XML Beans gibi iyi alternatifler de vardır.
Joachim Sauer

12

Üretimde beklenmedik bir hata olması durumunda ölüm sonrası analizlere izin vermek için nesne serileştirme kullanıyorum. Bir hesaplama girişleri bir veri dosyasına serileştirilir. Bir hata bildirilirse, basit bir program girişleri yeniden yükleyebilir ve bir hata ayıklayıcı eklenmiş olarak hesaplamayı yeniden çalıştırabilir. Ya da nesneleri yeniden yüklemek ve istenirse değiştirmek için harika bir kabuk kullanılabilir.

Ayrıca, Java nesnelerini HTTP üzerinden bir web hizmetine geçirmek için serileştirmeyi kullanırız. Metne ve metinden serileştirmekten çok daha kolay. Dezavantajı, istemci ve sunucu kurulumlarının birlikte dağıtılması gerektiğidir, ancak her iki ucu da kontrol ettiğimiz için sorun değil.


3
Bu ilginç bir kullanım örneği! "Daha karmaşık" bir sistemi aramak için çok küçük ve dezavantajların çoğu geçerli değil!
Joachim Sauer

Şimdi, daha kolay görüntüleme için Java nesnelerinden bir elektronik tablo oluşturmak için POI kullanan bir ölüm sonrası analizörü yazdık. Bu bize günlük dosyası inceleme saatlerce kurtardı.
kevin cline

7

Serileştirmenin serileştirmeme yöntemlerine göre avantajları nelerdir?

Java serileştirmenin bazı avantajları vardır:

  • Sistemde yerleşik: Üçüncü taraf araçlara, kitaplıklara veya yapılandırmaya güvenmeniz gerekmez.

  • En azından başlangıçta, anlaşılması nispeten basit .

  • Her geliştirici bunu bilir (ya da yapmalıdır). Java geliştiricilerinin onaylamasına veya onaylamamasına bakılmaksızın, büyük olasılıkla Java nesnelerini serileştirmeye aşina olmaları muhtemeldir.

Ve elbette, dezavantajları var:

  • Standart Java akışını engeller. Belleği ayırır, ancak bir yapıcı çağırmaz, bu nedenle geçici alanlar başlatılmaz. Alanlar kaynak sırasına göre değil alfabetik sıraya göre başlatılır.

  • Alan açısından çok verimli değil , ama korkunç değil. Sonucu sıkıştırmak isteyebilirsiniz.

  • Nesneleriniz değiştiğinde önlem almazsanız gevrekleşin . Ve o zaman bile.

Ne zaman kullanılmalı ve ne zaman kullanılmamalıdır?

Aşağıdaki durumlarda kullanın :

  • Dağıtım boyutu önemlidir. Sistemde yerleşik, böylece 0 ekstra bayt.

  • Tüm aktörler uyumlu sürümleri kullanacaktır.

  • Uzun süreli depolama bir sorun değildir.

Şu durumlarda kaçının :

  • Yukarıdakilerin hiçbiri geçerli değildir.

3

Serileştirme ve bir ORM / veritabanı bazı örtüşme olsa da farklı şeylerdir.

Serileştirilmiş bir nesne, kalıcı bir nesneyi "eritmek" ve verilerini yeniden doldurmak için gereken tüm bilgileri temsil eder. Bir ORM ve veritabanı, verileri veritabanına saklar. Sınıf, ORM tarafından veritabanında depolanmayan bilgi alanlarına sahip olabilir, örneğin hesaplanan alan.

Ayrıca, serileştirme ve bir ORM farklı sorunları çözüyor. Serileştirme, bir nesne grafiğini bir akışa (bellek, dosya sistemi vb.) Devam ettirme sorununu çözer. Bir ORM, arama ve tembel yükleme gibi özellikler sağlamanın yanı sıra, bilgi parçalarının veritabanı sütunlarına eşlenmesini ve nesnelerin alınması ve başlatılmasını yönetir.

Büyük miktarda veriyle uğraştığınız veya raporlama, arama / sorgulama, depolama veya veritabanlarının iyi olduğu diğer şeylere ihtiyaç duyduğunuz durumlar için veritabanına veri devam etmek istediğinizde ORM kullanın. Veri yapılarınızın bir sunumunu diske kaydetmek istediğinizde serileştirmeyi kullanın.


0

Serileştirme pratikte nadiren kullanılır.

Daha önce de belirtildiği gibi, serileştirme için en yaygın kullanım durumu nesneleri bir oturum veritabanında blob olarak saklamaktır. Bu iki nedenden ötürü iyi sonuç verir: oturumlar kısa ömürlü olma eğilimindedir ve oturum veritabanı, keyfi nesneleri ilişkisel bir modele nasıl eşleyeceğine dair hiçbir bilgiye sahip değildir.

Uzun süre saklanması gereken veriler için (Amazon alışveriş sepeti gibi) en iyi uygulama, bu verileri bir veritabanında saklamaktır.

Oturum kalıcılığı mekanizması, etkin oturumu olan bir kullanıcının aynı sunucuya döndürülmesini sağlar. Oturum veritabanına yalnızca bir sunucu başarısız olduğunda ve kullanıcı yeni bir sunucuya yeniden yönlendirildiğinde erişilir. Yeni sunucu etkin bir oturum algılar ancak bellekte bulamaz, bu nedenle kullanıcıya sorunsuz bir deneyim sağlamak amacıyla oturumu oturum veritabanından almaya çalışır.

Bu yaklaşımla ilgili iki sorun vardır:

İlk olarak, oturum verilerinin oturum veritabanına temizlenmesi yavaş bir işlemdir. Oturum verilerinin çok sık temizlenmesi performansı düşürür ve çoğu sunucu her 30 saniyede bir veya dakikada bir veya daha uzun süre temizleyecek şekilde yapılandırılır. Bu "görünmez" yük devretme çözümü hiçbir zaman% 100 etkili değildir.

İkincisi, deneyimim çoğu istemci, kullanıcının bir sunucunun başarısız olduğu nadir durumlarda oturum açmasını ve tekrar denemesini isteyen bir hata mesajı atmayı kabul etmesidir. Bu durumda, oturum veritabanını tamamen kapatırız ve performans artışının tadını çıkarırız.

Serileştirmenin bir başka kullanımı, sunucu-istemci etkileşimleri için serileştirme ve nesne grafiklerinin sıkıştırılmasını kullanan Flex gibi çerçeveler kullanarak daha hızlı yanıt süreleri sağlamaktır.

Diğerlerinin de belirttiği gibi, serileştirmeyi kullanmak için bazı yaratıcı ve yararlı nedenler vardır, ancak bunlar pratikte nadirdir.

Tarihsel olarak serileştirmenin doğru bir şekilde uygulanması ve güvenilirliği zordur, bu da kullanımını az sayıda vaka ile sınırlar. Çoğu geliştirici asla nesneleri kendileri serileştirmez, ancak sahne arkasında yapan çerçevelere güvenebilir.


2
"Serileştirme pratikte nadiren kullanılır." - Serileştirme genellikle REST web hizmetleri dünyasında denir. Çoğu zaman, sadece Dizeler ve Tamsayılarla veya benzerleriyle uğraşır - ama gerçek bir şey ve daha karmaşık nesneler bunun farkında olmalıdır. Nadiren kullanıldığını söylemek, onu sıkça kullanan büyük bir alan alanını yok sayar.

0

"Java serileştirme ne zaman kullanılır" ve "Java serileştirme ne zaman engellenir"

Aşağıdaki durumlarda Java serileştirmesini kullanın

  • az kodlama gerekli
  • ikili verilerin insan tarafından okunabilir olmaması önemli değildir
  • serileştirilmiş verilerde arama yapmak gerekli değildir (veritabanı benzeri bir sorgu mümkün değildir)
  • ya
    • serileştirilmiş veri yapısı değişmez veya
    • "veri yapısı değişikliğinden" sonra depolanmış serileştirilmiş verilerin okunamayacağı önemli değildir (örneğin, bir web uygulamasındaki oturum verileri)

Diğer tüm durumlarda "İkili Java serileştirmesi" kötü

Alternatifler

  • xml serileştirme
  • nosql veritabanı
  • ORM ile ilişkisel veritabanı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.