Apa perbedaan antara Serializable
dan Externalizable
di Jawa?
Apa perbedaan antara Serializable
dan Externalizable
di Jawa?
Untuk menambah jawaban lain, dengan mengimplementasikan java.io.Serializable
, Anda mendapatkan kemampuan serialisasi "otomatis" untuk objek kelas Anda. Tidak perlu menerapkan logika lain, itu hanya akan berfungsi. Java runtime akan menggunakan refleksi untuk mengetahui cara menyusun dan menghapus objek Anda.
Dalam versi Java yang lebih lama, refleksi sangat lambat, dan karenanya serializaing grafik objek besar (misalnya dalam aplikasi RMI client-server) adalah sedikit masalah kinerja. Untuk menangani situasi ini, java.io.Externalizable
antarmuka disediakan, yang seperti java.io.Serializable
tetapi dengan mekanisme yang dibuat khusus untuk melakukan fungsi marshalling dan unmarshalling (Anda perlu mengimplementasikan readExternal
dan writeExternal
metode pada kelas Anda). Ini memberi Anda sarana untuk mengatasi hambatan kinerja refleksi.
Dalam versi Jawa terbaru (1.3 dan seterusnya, tentu saja) kinerja refleksi jauh lebih baik daripada sebelumnya, dan ini jauh lebih sedikit masalah. Saya curiga Anda akan kesulitan untuk mendapatkan manfaat yang berarti dari Externalizable
JVM modern.
Juga, mekanisme serialisasi Java bawaan bukan satu-satunya, Anda bisa mendapatkan penggantian pihak ketiga, seperti JBoss Serialization, yang jauh lebih cepat, dan merupakan pengganti drop-in untuk default.
Kelemahan besar Externalizable
adalah Anda harus mempertahankan logika ini sendiri - jika Anda menambah, menghapus, atau mengubah bidang di kelas Anda, Anda harus mengubah metode writeExternal
/ Anda readExternal
untuk menjelaskannya.
Singkatnya, Externalizable
adalah peninggalan dari Jawa 1,1 hari. Benar-benar tidak perlu lagi.
Externalizable
membantu banyak .Externalizable
cocok untuk saya jauh lebih baik, karena saya tidak ingin menampilkan array dengan ruang kosong atau objek placeholder, ditambah dengan antarmuka eksplisit Anda dapat menangani warisan, yang berarti sub tersinkronisasi saya -kelas dapat dengan mudah menambahkan mengunci di sekitar panggilanwriteExternal()
. Jadi ya, Externalizable masih sangat relevan, tentunya untuk objek besar atau kompleks.Serialisasi memberikan fungsionalitas default untuk menyimpan dan kemudian membuat ulang objek. Menggunakan format verbose untuk mendefinisikan seluruh grafik objek yang akan disimpan misalkan Anda memiliki linkedList dan kode Anda seperti di bawah ini, maka serialisasi default akan menemukan semua objek yang terhubung dan akan bersambung. Dalam serialisasi default, objek dibangun sepenuhnya dari bit yang tersimpan, tanpa panggilan konstruktor.
Tetapi jika Anda ingin serialisasi terbatas atau tidak ingin sebagian dari objek Anda menjadi serial, gunakan Externalizable. Antarmuka Externalizable memperluas antarmuka Serializable dan menambahkan dua metode, writeExternal () dan readExternal (). Ini secara otomatis disebut serialisasi atau deserialization. Ketika bekerja dengan Externalizable kita harus ingat bahwa konstructer default harus publik atau kode akan membuang pengecualian. Silakan ikuti kode di bawah ini:
Di sini jika Anda mengomentari konstruktor default, maka kode tersebut akan membuang pengecualian di bawah ini:
Kita dapat mengamati bahwa kata sandi adalah informasi sensitif, jadi saya tidak membuat serialisasi dalam metode writeExternal (ObjectOutput oo) dan tidak menetapkan nilai yang sama di readExternal (ObjectInput oi). Itulah fleksibilitas yang disediakan oleh Externalizable.
Output dari kode di atas adalah seperti di bawah ini:
Kita dapat mengamati karena kita tidak menetapkan nilai passWord jadi nol.
Hal yang sama juga dapat dicapai dengan mendeklarasikan bidang kata sandi sebagai sementara.
Semoga ini bisa membantu. Saya minta maaf jika saya melakukan kesalahan. Terima kasih.
sumber
Perbedaan utama antara
Serializable
danExternalizable
Serializable
adalah antarmuka penanda tanpa metode apa pun.Externalizable
antarmuka berisi dua metode:writeExternal()
danreadExternal()
.Serializable
antarmuka yang mengimplementasikan kelas . Programer mendefinisikan proses Serialisasi akan ditendang untuk kelas yang mengimplementasikanExternalizable
antarmuka.Externalizable
antarmuka. Anda dapat mendukung berbagai versi objek Anda. Jika Anda menerapkanExternalizable
, Anda bertanggung jawab untuk membuat cerita bersambungsuper
kelasSerializable
menggunakan refleksi untuk membangun objek dan tidak memerlukan konstruktor arg. TetapiExternalizable
menuntut konstruktor tanpa argumen publik.Rujuk ke blog dengan
Hitesh Garg
untuk lebih jelasnya.sumber
Serialisasi menggunakan perilaku default tertentu untuk menyimpan dan kemudian membuat ulang objek. Anda dapat menentukan dalam urutan apa atau bagaimana menangani referensi dan struktur data yang kompleks, tetapi pada akhirnya bermuara pada penggunaan perilaku default untuk setiap bidang data primitif.
Eksternalisasi digunakan dalam kasus langka yang Anda benar-benar ingin menyimpan dan membangun kembali objek Anda dengan cara yang sama sekali berbeda dan tanpa menggunakan mekanisme serialisasi default untuk bidang data. Misalnya, bayangkan Anda memiliki skema penyandian dan kompresi unik Anda sendiri.
sumber
Obyek Serialization menggunakan antarmuka Serializable dan Externalizable. Objek Java hanya bisa serial. jika suatu kelas atau salah satu dari superclasses mengimplementasikan antarmuka java.io.Serializable atau subinterface-nya, java.io.Externalizable. Sebagian besar kelas java serializable .
NotSerializableException
:packageName.ClassName
«Untuk berpartisipasi dalam Obyek Kelas dalam proses serialisasi, kelas harus mengimplementasikan antarmuka Serializable atau Eksternalisasi.Antarmuka Serializable
Serialisasi objek menghasilkan aliran dengan informasi tentang kelas Java untuk objek yang disimpan. Untuk objek serializable, informasi yang cukup disimpan untuk mengembalikan objek-objek itu bahkan jika versi implementasi kelas yang berbeda (namun kompatibel) ada. Antarmuka Serializable didefinisikan untuk mengidentifikasi kelas yang mengimplementasikan protokol serializable:
InvalidClassException
«Dalam proses deserialisasi, jika nilai serialVersionUID kelas lokal berbeda dari kelas pengirim yang bersangkutan. kemudian berakibat konflik sebagaijava.io.InvalidClassException: com.github.objects.User; local class incompatible: stream classdesc serialVersionUID = 5081877, local class serialVersionUID = 50818771
Antarmuka Eksternalisasi
Untuk objek yang dapat dieksternalisasi, hanya identitas kelas objek yang disimpan oleh wadah; kelas harus menyimpan dan mengembalikan konten. Antarmuka yang Eksternalisasi didefinisikan sebagai berikut:
OptionalDataException
«Kolom HARUS DALAM PESANAN DAN TIPE YANG SAMA saat kami menuliskannya. Jika ada ketidakcocokan jenis dari aliran itu melempar OptionalDataException.Bidang instance kelas yang ditulis (terbuka) untuk
ObjectOutput
mendapatkan serial.Contoh « mengimplementasikan Serializable
Contoh « mengimplementasikan Externalizable
Contoh
@Lihat
sumber
Antarmuka yang Eksternalisasi sebenarnya tidak disediakan untuk mengoptimalkan kinerja proses serialisasi! tetapi untuk menyediakan cara menerapkan pemrosesan kustom Anda sendiri dan menawarkan kontrol penuh atas format dan konten aliran untuk objek dan tipe supernya!
Contohnya adalah penerapan remoting AMF (ActionScript Message Format) untuk mentransfer objek skrip aksi asli melalui jaringan.
sumber
https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html
Serialisasi default agak bertele-tele, dan mengasumsikan skenario penggunaan seluas mungkin dari objek berseri, dan karenanya format default (Serializable) menjelaskan aliran yang dihasilkan dengan informasi tentang kelas objek berseri.
Eksternalisasi memberi produsen aliran objek kontrol penuh atas meta-data kelas yang tepat (jika ada) di luar identifikasi kelas yang minimal diperlukan (misalnya namanya). Ini jelas diinginkan dalam situasi tertentu, seperti lingkungan tertutup, di mana produsen aliran objek dan penggunanya (yang mengubah objek dari aliran) dicocokkan, dan metadata tambahan tentang kelas tidak memiliki tujuan dan menurunkan kinerja.
Selain itu (seperti yang ditunjukkan oleh Uri) eksternalisasi juga menyediakan kontrol penuh atas penyandian data dalam aliran yang sesuai dengan tipe Java. Sebagai contoh (dibuat-buat), Anda mungkin ingin merekam boolean true sebagai 'Y' dan false sebagai 'N'. Eksternalisasi memungkinkan Anda melakukan itu.
sumber
Saat mempertimbangkan opsi untuk meningkatkan kinerja, jangan lupa serialisasi khusus. Anda dapat membiarkan Java melakukan apa yang dilakukannya dengan baik, atau setidaknya cukup baik, gratis , dan memberikan dukungan khusus untuk apa yang dilakukannya dengan buruk. Ini biasanya jauh lebih sedikit kode daripada dukungan penuh eksternalisasi.
sumber
Ada begitu banyak perbedaan yang ada antara Serializable dan Externalizable tetapi ketika kita membandingkan perbedaan antara custom Serializable (override writeObject () & readObject ()) dan Externalizable maka kita menemukan bahwa implementasi custom terikat erat dengan kelas ObjectOutputStream di mana seperti dalam kasus Externalizable, kita sendiri menyediakan implementasi ObjectOutput yang mungkin kelas ObjectOutputStream atau bisa juga yang lain seperti org.apache.mina.filter.codec.serialization.ObjectSerializationOutputStream
Dalam hal antarmuka Externalizable
Saya telah menambahkan kode sampel untuk menjelaskan lebih baik. silakan periksa objek objek Externalizable. Ini tidak terikat dengan implementasi apa pun secara langsung.
Sedangkan Outstream / Instream mengikat erat ke kelas. Kita dapat memperluas ObjectOutputStream / ObjectInputStream tetapi akan sedikit sulit untuk digunakan.
sumber
Pada dasarnya,
Serializable
adalah antarmuka penanda yang menyiratkan bahwa suatu kelas aman untuk serialisasi dan JVM menentukan bagaimana itu serial.Externalizable
berisi 2 metode,readExternal
danwriteExternal
.Externalizable
memungkinkan pelaksana untuk memutuskan bagaimana suatu objek diserialisasi,Serializable
sedangkan serialisasi objek dengan cara default.sumber
Beberapa perbedaan:
Untuk Serialisasi tidak diperlukan konstruktor default kelas itu karena Objek karena JVM membangun yang sama dengan bantuan API Refleksi. Dalam kasus kontruktor Eksternalisasi tanpa arg diperlukan, karena kontrol ada di tangan program dan kemudian menetapkan data deserialized ke objek melalui setter.
Dalam serialisasi jika pengguna ingin melewatkan properti tertentu untuk diserialisasi maka harus menandai properti itu sebagai sementara, sebaliknya tidak diperlukan untuk Eksternalisasi.
Ketika dukungan kompatibilitas mundur diharapkan untuk kelas apa pun maka disarankan untuk pergi dengan Externalizable. Serialisasi mendukung defaultObject bertahan dan jika struktur objek rusak maka akan menyebabkan masalah saat deserializing.
sumber