Kapan kita harus mengimplementasikan antarmuka Serializable?

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. Kapan saya harus mengimplementasikan Serializableantarmuka?
  2. Mengapa kita melakukan itu?
  3. Apakah itu memberikan keuntungan atau keamanan?
theJava
sumber
1
FYI jawaban yang diterima di sini tidak lengkap dan menyesatkan, karena tidak mengatasi kelemahan keamanan. Lihat Java Efektif , item 86: Implement Serializable dengan sangat hati-hati. Jawaban Raedwald di sini mengatakan tidak menggunakan serialisasi adalah jawaban yang benar.
Nathan Hughes

Jawaban:

157
  1. Dari Apa ini "serialisasi" semua tentang? :

    Ini memungkinkan Anda mengambil objek atau grup objek, meletakkannya di disk atau mengirimnya melalui mekanisme transportasi kabel atau nirkabel, lalu nanti, mungkin di komputer lain, membalikkan proses: menghidupkan kembali objek asli. Mekanisme dasarnya adalah untuk meratakan objek menjadi aliran bit satu dimensi, dan untuk mengubah aliran bit kembali ke objek asli.

    Seperti Transporter di Star Trek, ini semua tentang mengambil sesuatu yang rumit dan mengubahnya menjadi urutan datar 1s dan 0s, kemudian mengambil urutan 1s dan 0s (mungkin di tempat lain, mungkin di waktu lain) dan merekonstruksi rumit asli " sesuatu."

    Jadi, terapkan Serializableantarmuka saat Anda perlu menyimpan salinan objek, kirim ke proses lain yang berjalan pada sistem yang sama atau melalui jaringan.

  2. Karena Anda ingin menyimpan atau mengirim objek.

  3. Itu membuat menyimpan dan mengirim objek mudah. Itu tidak ada hubungannya dengan keamanan.

moinudin
sumber
4
Apakah ini praktik terbaik untuk mengimplementasikan antarmuka seriablizble ke semua model domain ...
theJava
8
@theJava Ini bukan pertanyaan tentang praktik terbaik. Ini pertanyaan apakah Anda perlu serangkaian byte atau tidak.
moinudin
5
Saat menggunakan JSON Anda tidak harus mengimplementasikan antarmuka ini dan cukup mengirim string itu .. jadi saya masih tidak yakin mengapa menggunakan antarmuka ini ketika Anda bisa menggunakan JSON.
Yonatan Nir
1
@YonatanNir Saya tidak yakin mengapa orang akan menggunakan JSON ketika MsgPack, Avro, Thrift, atau Protobuf lebih baik untuk transfer IO.
OneCricketeer
1
@YonatanNir Skema yang didefinisikan secara ketat lebih baik. Dan JSON dimaksudkan agar dapat dibaca oleh manusia, sedangkan format yang disandikan biner jauh lebih efisien melalui kabel
OneCricketeer
48
  1. Menerapkan Serializableantarmuka ketika Anda ingin dapat mengubah instance kelas menjadi serangkaian byte atau ketika Anda berpikir bahwa Serializableobjek mungkin referensi instance kelas Anda.

  2. Serializable kelas berguna ketika Anda ingin tetap contoh atau mengirimnya melalui kawat.

  3. Contoh Serializablekelas dapat dengan mudah ditransmisikan. Serialisasi tidak memiliki beberapa konsekuensi keamanan. Baca Joshua Bloch's Java Efektif .

Steve Emmerson
sumber
32

Jawaban atas pertanyaan ini adalah, mungkin secara mengejutkan, tidak pernah , atau lebih realistis, hanya ketika Anda dipaksa untuk interoperabilitas dengan kode lama . Ini adalah rekomendasi dalam Java Efektif, Edisi ke-3 oleh Joshua Bloch:

Tidak ada alasan untuk menggunakan serialisasi Java dalam sistem baru apa pun yang Anda tulis

Kepala arsitek Oracle, Mark Reinhold, pada catatan mengatakan menghapus mekanisme serialisasi Java saat ini adalah tujuan jangka panjang.


Mengapa serialisasi Java cacat

Java menyediakan skema serialisasi yang bisa Anda pilih sebagai bagian dari bahasa, dengan menggunakan Serializableantarmuka. Namun skema ini memiliki beberapa kelemahan yang tidak dapat dipecahkan dan harus diperlakukan sebagai percobaan yang gagal oleh perancang bahasa Jawa.

  • Hal mendasar berpura-pura bahwa seseorang dapat berbicara tentang itu bentuk serial dari suatu objek. Tetapi ada banyak skema serialisasi yang tak terhingga, menghasilkan banyak bentuk serialisasi yang tak terhingga. Dengan memaksakan satu skema, tanpa ada cara mengubah skema, aplikasi tidak dapat menggunakan skema yang paling sesuai untuk mereka.
  • Ini diimplementasikan sebagai sarana tambahan untuk membangun objek, yang mem-bypass prekondisi apa pun yang dilakukan konstruktor atau metode pabrik Anda. Kecuali tertulis rumit, rawan kesalahan, dan sulit untuk menguji kode deserialisasi tambahan, kode Anda mungkin memiliki kelemahan keamanan yang menganga.
  • Menguji interoperabilitas versi berbeda dari bentuk serial sangat sulit.
  • Menangani benda yang tidak bisa bergerak adalah masalah.

Apa yang harus dilakukan

Alih-alih, gunakan skema serialisasi yang dapat Anda kontrol secara eksplisit. Seperti Protokol Buffer, JSON, XML, atau skema kustom Anda sendiri.

Raedwald
sumber
2
tidak banyak ahli di tingkat itu tetapi merasa Anda ada benarnya.
Nightfury
1
Saya pikir itu jawaban terbaik!
jjanczur