Java'da Serileştirmenin amacı nedir?


105

Serileştirme ve bunun ne kadar güzel ve harika olduğu üzerine pek çok makale okudum ama hiçbir argüman yeterince ikna edici değildi. Bir dersi serileştirerek gerçekten başarabileceğimiz şeyin ne olduğunu bana gerçekten söyleyip söyleyemeyeceğini merak ediyorum.


10
Argümanları hakkında "ikna edici olmayan" ne? Ve neden sorularınızın cevaplarını kabul etmediniz?
Anon.

8
Sorularına "ikna olmadı".
Anthony Forloney

5
Verilen cevaplar aslında doğruydu. Sizin için işe yaramazlarsa, onlara yorum olarak yanıt verin ve onları görmezden gelmek yerine çözmeye çalışın ve ardından SO'yu doğru kullanmadığınızı belirttiklerinde başkalarını alevlendirmeye başlayın.
Anon.

4
Anon, yinelenen soruları caydırarak sitenin kalitesine katkıda bulunuyor. Aynı şeyi soran beş ayrı soruyu görmek aptalca. Bir cevap alamıyorsanız, bazen de böyledir. Bir yanıt alırsanız ancak işe yaramazsa, tartışmaya yorumlarda devam edin. SO, sadece doğru soruyu sorarsanız veya yeterince zaman sorarsanız veya doğru uzmanın dikkatini çekerseniz size sihirli bir şekilde cevap verecek sihirli bir kutu değildir.
Chris

1
Ya: (Cevabı kabul edin) veya (Bir yorum gönderin ve / veya neden ihtiyacınız olmadığını açıklayan soruyu değiştirin).
Anon.

Yanıtlar:


183

Önce serileştirmeyi tanımlayalım, sonra neden bu kadar kullanışlı olduğu hakkında konuşalım.

Serileştirme, var olan bir nesneyi bir bayt dizisine dönüştürmektir. Bu bayt dizisi, nesnenin sınıfını, nesnenin sürümünü ve nesnenin dahili durumunu temsil eder. Bu bayt dizisi daha sonra JVM'nin nesneyi iletmek / okumak için aynı kodu çalıştırması arasında kullanılabilir.

Bunu neden yapmak isteyelim?

Birkaç sebep var:

  • İletişim: Aynı kodu çalıştıran iki makineniz varsa ve iletişim kurmaları gerekiyorsa, kolay bir yol, bir makinenin iletmek istediği bilgilerle bir nesne oluşturması ve ardından bu nesneyi diğer makineye serileştirmesidir. İletişim için en iyi yöntem değil ama işi hallediyor.

  • Kalıcılık: Belirli bir işlemin durumunu bir veritabanında depolamak istiyorsanız, bir bayt dizisine kolayca serileştirilebilir ve daha sonra geri almak için veritabanında saklanabilir.

  • Derin Kopya: Bir Nesnenin tam bir kopyasına ihtiyacınız varsa ve kendi özel klon () sınıfınızı yazma zahmetine girmek istemiyorsanız, nesneyi bir bayt dizisine serileştirmek ve ardından onu başka bir diziye dönüştürmek için basitçe nesne bu hedefe ulaşır.

  • Önbelleğe alma: Gerçekten yukarıdakilerin bir uygulamasıdır, ancak bazen bir nesnenin oluşturulması 10 dakika sürer, ancak serileştirmenin kaldırılması yalnızca 10 saniye sürer. Bu nedenle, bellekteki dev nesneyi tutmak yerine, dizgeleştirme yoluyla bir dosyaya önbelleğe alın ve daha sonra gerektiğinde okuyun.

  • Çapraz JVM Senkronizasyonu: Serileştirme, farklı mimarilerde çalışan farklı JVM'lerde çalışır.


62
Neyi inşa etmek 10 dakika sürüyor?
oxbow_lakes

2
Benim amacım (tabii ki) serileştirme ile ilgili dosya G / Ç'sinin herhangi bir saf nesne oluşturma ek yükünü muhtemelen gölgede bırakacağıdır. Sana hesaplama şey hakkında bilimsel modelleme gibi çok pahalı konuşurken olabilir ama serileştirme nedeniyle bu sap şema değişiklikleri zor olmasının kalıcılığı için çok kötü bir mekanizma olduğunu varsayalım
oxbow_lakes

11
@oxbow_lakes Hızlı arama için belirli bir veri kümesinin dizinini tutuyorsanız buna bir örnek verilebilir. Bunun gibi bir dizinin oluşturulması çok uzun zaman alabilir, ancak bir kez oluşturduğunuzda, nispeten hızlı bir şekilde serileştirilebilir / serileştirilebilir.
David

Web uygulaması isteğinin hedefe ulaşmadan, nesneyi oluşturmadan, nesneyle mümkün olan en uzun yolu kullanarak geri dönmeden önce dünyadaki her bir yönlendiriciden geçmesi gerekiyorsa, Evet, 10 dakika sürebilir.
Vaibs

@Schmelter, Seri hale getirmenin iletişim için en iyi yöntem olmadığını söylediğinize göre, o zaman uygulanacak en uygun ve en iyi yöntem hangisidir?
Ashfaque Rifaye

58

Uygulamanızı çalıştırırken, tüm nesneleri bellekte (RAM) saklanır. Çıktığınızda, bu bellek işletim sistemi tarafından geri kazanılır ve programınız esasen çalışırken olan her şeyi 'unutur'. Serileştirme, uygulamanızın nesneleri diske kaydetmesine izin vererek bunu çözer, böylece bir dahaki sefer başladığında geri okuyabilir. Uygulamanız önceki bir durumu kaydetmenin / paylaşmanın herhangi bir yolunu sağlayacaksa, bir çeşit serileştirmeye ihtiyacınız olacaktır.


2
Öyleyse, bir dosyaya veri yazmanın ve gerektiğinde geri okumanın daha iyi, daha verimli bir yolu gibi görünüyor?
m_a_khan

1
Bu tek GERÇEK açıklama. Başka bir gerçek dünya serileştirme uygulaması düşünemiyorum +1
Emily

Kısa ve güzel. Mükemmel açıklama.
Yakhoob

21

Hikayemi paylaşabilirim ve umarım serileştirmenin neden gerekli olduğu konusunda bazı fikirler verir. Bununla birlikte, sorunuzun cevapları zaten oldukça ayrıntılı.

Bir sürü metin dosyası yüklemem ve okumam gereken birkaç projem vardı. Dosyalarda durdurma sözcükleri, biyomedikal fiiller, biyomedikal kısaltmalar, anlamsal olarak birbirine bağlı sözcükler vb. Bulunur. Bu dosyaların içeriği basittir: sözcükler !

Şimdi her proje için, bu dosyaların her birindeki kelimeleri okuyup farklı dizilere koymam gerekiyordu; dosyanın içeriği hiç değişmediğinden, ilk projeden sonra yaygın, ancak gereksiz bir görev haline geldi.

Yaptığım şey, bu dosyaların her birini okumak ve ayrı dizileri (nesnelerin örnek değişkenleri) doldurmak için bir nesne oluşturmamdı. Sonra nesneleri serileştirdim ve daha sonraki projeler için basitçe seri durumlarını kaldırdım. Dosyaları okumam ve dizileri tekrar tekrar doldurmam gerekmedi.


1
Böyle bir durumda, neden onları bayt dizisi akışında depolamanız gerekiyor (serileştirme kullanarak), geçici bir alan kullanmaktan daha basit olabilir mi?
kidnan1991

3

Temelde :

Serileştirme, birbirine referanslar içeren bir dizi nesne örneğini doğrusal bir bayt akışına dönüştürme işlemidir, bu daha sonra bir soket aracılığıyla gönderilebilir, bir dosyaya kaydedilebilir veya basitçe bir veri akışı olarak değiştirilebilir.

Dan kullanımları Bkz Wiki :

Serileştirmenin birçok avantajı vardır. Şunları sağlar:

  1. özelliklerini diskteki bir metin dosyasına yazmaktan ve bunları tekrar okuyarak yeniden bir araya getirmekten daha uygun olan nesneleri kalıcı hale getirmek için bir yöntem.
  2. örneğin SOAP'ta olduğu gibi uzak prosedür çağrıları yayınlama yöntemi
  3. Özellikle COM, CORBA, vb. gibi yazılım bileşenlerinde nesneleri dağıtmak için bir yöntem.
  4. zamanla değişen verilerdeki değişiklikleri tespit etmek için bir yöntem.

1

En bariz olanı, serileştirilmiş sınıfı bir ağ üzerinden iletebilmeniz ve alıcının orijinal instanstance'ın bir kopyasını oluşturabilmesidir. Aynı şekilde, serileştirilmiş bir yapıyı bir dosya sistemine kaydedebilirsiniz.

Ayrıca, serileştirmenin özyinelemeli olduğunu unutmayın, bu nedenle, istenirse tek bir genişleme kümesinde bütün bir heterojen veri yapısını serileştirebilirsiniz.


0

Serileştirilmiş nesneler uzayda durumu korurlar, ağ, dosya sistemi vb. Üzerinden transfer edilebilirler ... ve zamanla, onları oluşturan JVM'den daha uzun süre yaşayabilirler.

Bazen bu faydalıdır.


Bu, bazı metinler de içeren basit bir dosyayla sağlanabilir. Serileştirilmiş bir nesneyi geri okumaktan sonra bir metin dosyasına yazılan nesnenin durumunu okumak biraz daha kolaydır, değil mi?
m_a_khan

@m_a_khan: Vay canına. Evet, basit bir metinle yapılabilir. Ancak, Nesneler daha karmaşık hale gelir gelmez veya yapıları (kompozisyon, kalıtım) daha karmaşık hale gelir gelmez, onları manuel olarak (ayrıştırmak) zorlaştıracaktır. Nesne üyeleri olarak listelerin, kümelerin ve haritaların olduğunu hayal edin.
Dirk Schumacher

Farklı serileştirme şemaları bulmak kolaydır ve gerçekten de çoğu vardır. Çok iyi nedenlerden dolayı, hiçbiri genel durumla sonuçlanmıyor, "basit bir metinle"
David Soroko

0

İşlevlere veya sınıf oluşturuculara ilettiğim argümanları standartlaştırmak için serileştirilmiş nesneler kullanıyorum. Serileştirilmiş bir fasulye aktarmak, uzun bir argüman listesinden çok daha temizdir. Sonuç, okunması ve hata ayıklaması daha kolay olan koddur.


1
Benim fikrime göre, tek bir yapılandırma nesnesini parametre olarak kullanmak oldukça diktir. Muhtemelen bu tipik bir kullanım durumu değildir.
Gábor Bakos

0

Öğrenmenin basit amacı için (dikkat edin, öğrenme dedim, en iyisini söylemedim, hatta iyi demedim, ama sadece işleri anlamak adına), verilerinizi bilgisayardaki bir metin dosyasına kaydedebilir ve ardından bir programa sahip olabilirsiniz. Bu bilgiyi okuyan ve dosyaya bağlı olarak, programınızın farklı şekilde yanıt vermesini sağlayabilirsiniz. Daha gelişmiş olsaydınız, bunun bir txt dosyası olması gerekmezdi, başka bir şey.

Öte yandan serileştirme, işleri doğrudan bilgisayar diline yerleştirir. Sanki bir İspanyol bilgisayara Fransızca bir şey söylemek yerine İspanyolca bir şeyler söylüyorsunuz, onu Fransızca öğrenmeye zorluyorsunuz, sonra her şeyi çevirerek bir şeyleri ana İspanyolcasına kaydediyorsunuz. En yoğun teknik cevap değil, sadece ortak bir dil formatında anlaşılır bir örnek oluşturmaya çalışıyorum.

Serileştirme de daha hızlıdır, çünkü Java'da nesneler yığın üzerinde işlenir ve yığında ilkel olarak gösterildiklerinden çok daha uzun sürer. Hız, hız, hız. Ve bir programcı açısından daha az dosya işleme.


Her şeyi düz bir İngilizceye koymaya çalışırken, serileştirmeyi herhangi bir yararlı şekilde açıklamadınız.
user3516726
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.