Serializable arayüzünü ne zaman uygulamalıyız?


153
public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. SerializableArayüzü ne zaman uygulamalıyım ?
  2. Neden bunu yapıyoruz?
  3. Herhangi bir avantaj veya güvenlik sağlıyor mu?

1
Buradaki kabul edilen cevap eksik ve yanıltıcıdır, çünkü güvenlik dezavantajlarını gidermez. Bkz. Etkili Java , madde 86: Serializable'ı büyük bir dikkatle uygulayın. Raedwald'ın burada serileştirilmemesini söyleyen cevabı doğrudur.
Nathan Hughes

Yanıtlar:


157
  1. Kimden Bu "serileştirme" şey nedir? :

    Bir nesneyi veya bir nesne grubunu almanıza, bir diske koymanıza veya bir tel veya kablosuz aktarım mekanizmasıyla göndermenize, daha sonra belki de başka bir bilgisayarda işlemi tersine çevirmenize izin verir: orijinal nesneleri yeniden diriltin. Temel mekanizmalar, nesneleri bir boyutlu bit akışına düzleştirmek ve bu bit akışını orijinal nesneye / nesnelere geri döndürmektir.

    Star Trek'teki Taşıyıcı gibi, her şey karmaşık bir şey alıp 1s ve 0s düz bir diziye dönüştürmek, sonra 1s ve 0s dizisini almak (muhtemelen başka bir yerde, muhtemelen başka bir zamanda) ve orijinal komplikasyonu yeniden yapılandırmaktır. bir şey."

    Bu nedenle, Serializablenesnenin bir kopyasını saklamanız, aynı sistemde veya ağ üzerinde çalışan başka bir işleme göndermeniz gerektiğinde arabirimi uygulayın .

  2. Çünkü bir nesneyi saklamak veya göndermek istiyorsunuz.

  3. Nesnelerin depolanmasını ve gönderilmesini kolaylaştırır. Güvenlikle ilgisi yok.


4
Tüm etki alanı modellerine seriablizble arabirimi uygulamak en iyi uygulamadır ...
Java

8
@theJava Bu en iyi uygulamalar meselesi değil. Bu, bayt dizisine ihtiyacınız olup olmayacağı sorusudur.
moinudin

5
JSON kullanırken bu arayüzü uygulamak zorunda değilsiniz ve sadece bu dize gönderebilirsiniz .. böylece hala JSON kullanabileceğiniz zaman neden bu arayüzü kullanmak için emin değilim.
Yonatan Nir

1
@YonatanNir MsgPack, Avro, Thrift veya Protobuf'un IO transferi için daha iyi olduğu durumlarda neden JSON kullanacağından emin değilim.
OneCricketeer

1
@YonatanNir Kesin olarak tanımlanmış bir şema daha iyidir. Ve JSON, insan tarafından okunabilir olması anlamına gelirken, ikili kodlanmış formatlar kablo üzerinden çok daha verimlidir
OneCricketeer

48
  1. SerializableBir sınıf örneğini bayt dizisine dönüştürmek istediğinizde veya bir Serializablenesnenin sınıfınızın bir örneğine başvurabileceğini düşündüğünüzde arabirimi uygulayın .

  2. Serializable sınıfları, örneklerini devam ettirmek veya bir tel üzerinden göndermek istediğinizde yararlıdır.

  3. SerializableSınıf örnekleri kolayca aktarılabilir. Ancak, serileştirmenin bazı güvenlik sonuçları vardır. Joshua Bloch'un Etkili Java'sını okuyun .


32

Bu sorunun cevabı, belki de şaşırtıcı bir şekilde, asla veya daha gerçekçi olarak, sadece eski kodla birlikte çalışabilmeniz gerektiğinde . Joshua Bloch'un Etkili Java, 3.Baskı önerisi :

Yazdığınız herhangi bir yeni sistemde Java serileştirmeyi kullanmak için hiçbir neden yoktur

Oracle'ın baş mimarı Mark Reinhold, mevcut Java serileştirme mekanizmasının kaldırılmasının uzun vadeli bir hedef olduğunu söylüyor.


Java serileştirmesi neden kusurlu?

Java, dilin bir parçası olarak, Serializablearabirimi kullanarak seçebileceğiniz bir serileştirme şeması sağlar. Bununla birlikte, bu şema birkaç inatçı kusura sahiptir ve Java dil tasarımcıları tarafından başarısız bir deneme olarak ele alınmalıdır.

  • Temelde bir kişinin bir nesnenin serileştirilmiş formu hakkında konuşabileceğini iddia eder . Ancak sonsuz sayıda serileştirme şeması vardır, bu da sonsuz sayıda serileştirilmiş formla sonuçlanır. Bir şemayı uygulayarak, şemayı değiştirmenin herhangi bir yolu olmadan, uygulamalar kendileri için en uygun şemayı kullanamazlar.
  • Nesnelerin inşa edilmesi için ek bir araç olarak uygulanır; bu, kurucularınızı veya fabrika yöntemlerinizi gerçekleştiren önkoşul kontrollerini atlar. Zor, hataya yatkın ve ekstra serileştirme kodunu test etmek zor olmadığı sürece, kodunuzun muhtemelen güvenlik açığı zayıftır.
  • Serileştirilmiş formun farklı sürümlerinin birlikte çalışabilirliğini test etmek çok zordur.
  • Değişmez cisimlerin taşınması zahmetlidir.

Bunun yerine ne yapmalı

Bunun yerine, açıkça denetleyebileceğiniz bir serileştirme şeması kullanın. Protokol Tamponları, JSON, XML veya kendi özel şemanız gibi.


2
bu düzeyde bir uzman değil, bir noktanız olduğunu hissediyorum.
nightfury

1
Bence bu en iyi cevap!
Ocak
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.