Proses ini juga dapat diimplementasikan melalui jaringan, yang pertama-tama dapat membuat objek pada mesin Windows, membuat serialisasi, dan kemudian mengirimkannya ke mesin Unix melalui jaringan, dan kemudian merakitnya kembali secara akurat. Mengapa masing -masing objek Java RMI, Socket, JMS, dan EJB Pass?
Mekanisme serialisasi objek Java umumnya memiliki dua kegunaan:
Java Javabeans: Informasi status kacang biasanya dikonfigurasi pada waktu desain. Bacalah keadaan objek untuk merekonstruksi objek dan kembalikan status program.
RMI memungkinkan objek pada mesin jarak jauh dioperasikan seperti pada mesin asli; atau program yang menggunakan soket untuk mentransfer objek di jaringan, ini memerlukan implementasi mekanisme serializaiton.
Kami dapat membuat serial kelas dengan membuat kelas mengimplementasikan antarmuka java.io.serializable. Antarmuka ini adalah antarmuka produsen. Artinya, agar kelas mengimplementasikannya, antarmuka tidak perlu menerapkan metode apa pun. Ini terutama digunakan untuk memberi tahu Java Virtual Machines (JVM) bahwa suatu objek perlu diserialisasi.
Ada beberapa poin yang perlu kita klarifikasi untuk ini:
Tidak semua kelas dapat diserialisasi.
Ada banyak kelas dasar di Java yang telah mengimplementasikan antarmuka serializable, seperti string, vektor, dll. Tetapi misalnya, Hashtable tidak mengimplementasikan antarmuka yang dapat diserialisasi.
Ada dua kelas utama untuk membaca atau menulis objek ke stream: ObjectOutputStream dan ObjectInputStream.ObjectOutputStream menyediakan metode WriteObject yang digunakan untuk menulis objek ke aliran output, dan ObjectInputStream menyediakan metode ReadObject untuk membaca objek dari aliran input. Objek yang menggunakan metode ini harus diserialisasi. Artinya, antarmuka yang dapat diserialisasi harus telah diimplementasikan. Jika Anda ingin menulis objek hashtable, maka Anda akan mendapatkan pengecualian.
Proses serialisasi adalah untuk menulis objek dan membaca objek dari aliran byte. Setelah mengubah status objek menjadi aliran byte, Anda dapat menyimpannya ke file menggunakan berbagai kelas aliran byte dalam paket java.io, pipa ke utas lain, atau mengirim data objek ke host lain melalui koneksi jaringan. Fungsi serialisasi objek sangat sederhana dan kuat, dan digunakan dalam RMI, Socket, JMS, dan EJB. Masalah serialisasi objek bukanlah topik yang paling menarik dalam pemrograman jaringan, tetapi ini cukup penting dan memiliki banyak signifikansi praktis.
Serialisasi objek dapat mengimplementasikan objek terdistribusi. Aplikasi utama seperti: RMI menggunakan serialisasi objek untuk menjalankan layanan pada host jarak jauh, seperti saat menjalankan objek pada mesin lokal.
Serialisasi objek Java tidak hanya menyimpan data dari satu objek, tetapi juga secara rekursif menyimpan data dari setiap objek yang dirujuk oleh objek. Seluruh hierarki objek dapat ditulis ke dalam aliran byte, disimpan dalam file, atau disahkan pada koneksi jaringan. Serialisasi objek dapat digunakan untuk melakukan "penyalinan yang dalam" dari objek, yaitu, menyalin objek itu sendiri dan objek yang dirujuk itu sendiri. Serialisasi suatu objek dapat menghasilkan seluruh urutan objek.
Serialisasi Java relatif sederhana dan biasanya tidak memerlukan penulisan kode khusus untuk menyimpan dan mengembalikan keadaan objek. Objek kelas yang mengimplementasikan antarmuka java.io.serializable dapat dikonversi menjadi atau dipulihkan dari aliran byte tanpa menambahkan kode apa pun ke kelas. Hanya dalam kasus yang jarang ada kode khusus yang diperlukan untuk menyimpan atau mengembalikan status objek. Catatan di sini: Tidak setiap kelas dapat diserialisasi, dan beberapa kelas tidak dapat diserialisasi.
Mekanisme Serialisasi:
Serialisasi dibagi menjadi dua bagian: serialisasi dan deserialisasi. Serialisasi adalah bagian pertama dari proses ini, memecah data menjadi aliran byte untuk penyimpanan dalam file atau transmisi melalui jaringan. Deserialisasi adalah untuk membuka aliran byte dan merekonstruksi objek. Serialisasi objek tidak hanya membutuhkan konversi tipe data dasar menjadi representasi byte, tetapi kadang -kadang juga memulihkan data. Memulihkan data membutuhkan instance objek yang mengembalikan data. Proses serialisasi di ObjectOutputStream terhubung ke aliran byte, termasuk jenis objek dan informasi versi. Selama deserialisasi, JVM menghasilkan instance objek dengan informasi header, dan kemudian menyalin data dari aliran byte objek ke anggota data objek. Mari kita jelaskan dalam dua bagian:
Memproses Aliran Objek: ( proses serialisasi dan proses deserialisasi)
Paket java.io memiliki dua kelas yang membuat serial objek. ObjectOutputStream bertanggung jawab untuk menulis objek ke aliran byte, dan ObjectInputStream merekonstruksi objek dari aliran byte.
Pertama -tama mari kita pahami kelas ObjectOutputStream. Kelas ObjectOutputStream memperluas antarmuka dataoutput.
Metode writeObject () adalah metode terpenting untuk serialisasi objek. Jika objek berisi referensi ke objek lain, metode writeObject () secara rekursif membuat serial objek ini. Setiap ObjectOutputStream memelihara tabel referensi objek serial untuk mencegah beberapa salinan dari objek yang sama dikirim. (Ini penting) karena writeObject () dapat membuat serialisasi seluruh set objek yang direferensikan silang, instance ObjectOutputStream yang sama secara tidak sengaja diminta untuk membuat serialisasi objek yang sama. Pada saat ini, serialisasi antireferensi dilakukan alih -alih menulis ke aliran byte objek lagi.
Selanjutnya, mari kita pahami kelas ObjectOutputStream dari contoh.
Salinan kode adalah sebagai berikut:
// Serialisasi tanggal hari ini ke dalam file.
FileOutputStream f = new FileOutputStream ("tmp");
ObjectOutputStream S = ObjectOutputStream baru (f);
S.WriteObject ("Today");
S.WriteObject (tanggal baru ());
s.flush ();
Sekarang, mari kita pahami kelas ObjectInputStream. Ini mirip dengan ObjectOutputStream. Itu memperluas antarmuka datalput. Metode dalam ObjectInputStream mencerminkan metode publik membaca Java Basic Data Type di DataInputStream. Metode readObject () menghapus objek dari aliran byte. Setiap kali metode readObject () dipanggil, objek berikutnya dalam aliran dikembalikan. Aliran byte objek tidak mengirimkan bytecode kelas, tetapi termasuk nama kelas dan tanda tangannya. Ketika readObject () menerima objek, JVM memuat kelas yang ditentukan di header. Jika kelas ini tidak dapat ditemukan, ReadObject () melempar ClassNotFoundException. Sisa metode ObjectInputStream digunakan untuk menyesuaikan proses deserialisasi.
Contohnya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
// deserialize objek string dan objek tanggal dari file
FileInputStream di = FileInputStream baru ("TMP");
ObjectInputStream S = ObjectInputStream baru (IN);
String hari ini = (string) s.readObject ();
Tanggal tanggal = (tanggal) s.readObject ();
Proses serialisasi yang disesuaikan:
Serialisasi biasanya dapat dilakukan secara otomatis, tetapi kadang -kadang prosesnya dapat dikendalikan. Java dapat mendeklarasikan kelas sebagai serial, tetapi masih dapat mengontrol anggota data secara manual yang dinyatakan statis atau sementara.
Contoh: Kelas serialisasi yang sangat sederhana.
Salinan kode adalah sebagai berikut:
Kelas publik SimpleSerializableClass mengimplementasikan serial {
String stoday = "hari ini:";
Tanggal transien dttoday = tanggal baru ();
}
Saat serial, semua anggota data kelas harus dapat diserialisasi kecuali yang dinyatakan sebagai sementara atau statis. Mendeklarasikan variabel sebagai transien memberi tahu JVM bahwa kami akan bertanggung jawab untuk membuat serial argumen. Setelah mendeklarasikan anggota data sebagai sementara, proses serialisasi tidak dapat menambahkannya ke aliran byte objek, dan tidak ada data yang dikirim dari anggota data sementara. Ketika menghapus data setelahnya, anggota data perlu direkonstruksi (karena itu adalah bagian dari definisi kelas), tetapi tidak berisi data apa pun karena anggota data ini tidak menulis data apa pun ke aliran. Ingatlah bahwa aliran objek tidak membuat serialisasi statis atau sementara. Kelas kami perlu menggunakan metode writeObject () dan readObject () untuk memproses anggota data ini. Saat menggunakan metode writeObject () dan readObject (), Anda juga harus memperhatikan membaca anggota data ini dalam urutan yang ditulis.
Beberapa kode tentang cara menggunakan serialisasi khusus adalah sebagai berikut
Salinan kode adalah sebagai berikut:
// Tulis ulang metode writeObject () untuk menangani anggota sementara.
public void writeObject (ObjectOutputStream OutputStream) melempar ioException {
outputStream.defaultwriteObject (); // buat metode writeObject () yang disesuaikan untuk
// Gunakan logika bawaan dalam serialisasi otomatis.
outputStream.writeObject (osocket.getInetAddress ());
outputStream.writeint (osocket.getport ());
}
// Tulis ulang metode readObject () untuk menerima anggota sementara.
Private Void ReadObject (ObjectInputStream InputStream) melempar IOException,
ClassNotFoundException {
inputStream.defaultreadObject (); // defaultreadObject () melengkapi serialisasi otomatis
Inetaddress oAddress = (inetaddress) inputStream.readObject ();
int iPort = inputStream.readint ();
osocket = soket baru (oaddress, iPort);
iid = getId ();
dttoday = tanggal baru ();
}
Kustomisasi sepenuhnya proses serialisasi:
Jika suatu kelas sepenuhnya bertanggung jawab atas serialisasi sendiri, ia mengimplementasikan antarmuka yang dapat dieksternalisasi alih -alih antarmuka serializable. Definisi antarmuka yang dapat dieksternalisasi mencakup dua metode writeexternal () dan readexternal (). Metode ini dapat digunakan untuk mengontrol bagaimana anggota data objek ditulis ke aliran byte. , tidak ada serialisasi otomatis sama sekali. Perhatikan di sini. Kelas deklarasi mengimplementasikan antarmuka yang dapat dieksternalisasi dengan risiko keamanan yang signifikan. Metode WriteExternal () dan ReadExternal () dinyatakan publik, dan kelas jahat dapat menggunakan metode ini untuk membaca dan menulis data objek. Jika objek berisi informasi sensitif, berhati -hatilah. Ini termasuk menggunakan soket yang aman atau mengenkripsi seluruh aliran byte. Pada titik ini, kami telah mempelajari pengetahuan dasar serialisasi.