pensirilan Java


Java menyediakan mekanisme siri objek Dalam mekanisme ini, objek boleh diwakili sebagai jujukan bait, yang merangkumi data objek, maklumat tentang jenis objek dan jenis data dalam objek.

Selepas menulis objek bersiri pada fail, anda boleh membacanya daripada fail dan menyahsirikannya, iaitu, maklumat jenis objek, data objek dan data dalam objek Jenis boleh digunakan untuk mencipta objek baharu dalam ingatan.

Keseluruhan proses adalah bebas Java Virtual Machine (JVM), iaitu objek yang disiri pada satu platform boleh menyahsiri objek pada platform yang berbeza sama sekali.

Kelas ObjectInputStream dan ObjectOutputStream ialah aliran data peringkat tinggi yang mengandungi kaedah untuk mensiri dan menyahsiri objek. Kelas

ObjectOutputStream mengandungi banyak kaedah penulisan untuk menulis pelbagai jenis data, dengan pengecualian satu kaedah tertentu:

public final void writeObject(Object x) throws IOException

Kaedah di atas mensirikan objek dan menghantarnya ke aliran output. Kelas ObjectInputStream yang serupa mengandungi kaedah berikut untuk menyahsiri objek:

public final Object readObject() throws IOException, 
                                 ClassNotFoundException

Kaedah ini mengambil objek seterusnya daripada aliran dan menyahsiri objek. Nilai pulangannya ialah Objek, oleh itu, anda perlu menukarnya kepada jenis data yang sesuai.

Untuk menunjukkan cara bersiri berfungsi dalam Java, saya akan menggunakan kelas Pekerja yang disebut dalam tutorial sebelumnya. Katakan kita mentakrifkan kelas Pekerja berikut, yang melaksanakan antara muka Serializable.

public class Employee implements java.io.Serializable
{
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + name
                           + " " + address);
   }
}

Sila ambil perhatian bahawa untuk objek kelas berjaya disiri, dua syarat mesti dipenuhi:

Kelas mesti melaksanakan objek java.io.Serializable.

Semua sifat kelas ini mesti boleh bersiri. Jika sesuatu harta tidak boleh bersiri, harta itu mesti ditandakan sebagai fana.

Jika anda ingin mengetahui sama ada kelas standard Java boleh bersiri, semak dokumentasi untuk kelas tersebut. Menyemak sama ada satu contoh kelas boleh disirikan adalah sangat mudah. ​​Cuma semak sama ada kelas itu melaksanakan antara muka java.io.Serializable.


Objek bersiri

Kelas ObjectOutputStream digunakan untuk mensiri objek Contoh SerializeDemo berikut membuat instantiat objek Pekerja dan mensirikan objek ke fail.

Selepas program dilaksanakan, fail bernama employee.ser dicipta. Program ini tidak menghasilkan sebarang output, tetapi anda boleh memahami perkara yang dilakukan oleh program dengan mengkaji kod tersebut.

Nota: Apabila mensiri objek ke fail, mengikut konvensyen standard Java, fail tersebut diberikan sambungan .ser.

import java.io.*;

public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      try
      {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

Objek penyahserialisasian

Program DeserializeDemo di bawah menghidupkan penyahserikatan dan /tmp/employee.ser menyimpan objek Pekerja.

import java.io.*;
public class DeserializeDemo
{
   public static void main(String [] args)
   {
      Employee e = null;
      try
      {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i)
      {
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c)
      {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
    }
}

Hasil penyusunan dan larian program di atas adalah seperti berikut:

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

Perkara berikut perlu diperhatikan di sini:

Blok kod cuba/tangkap dalam readObject () kaedah cuba menangkap pengecualian ClassNotFoundException . Untuk JVM dapat menyahsiri objek, ia mestilah kelas yang boleh mencari bytecode. Jika JVM tidak dapat mencari kelas semasa penyahserialisasian objek, ClassNotFoundException dilemparkan.

Perhatikan bahawa nilai pulangan kaedah readObject() ditukar kepada rujukan Pekerja.

Apabila objek bersiri, nilai atribut SSN ialah 111222333, tetapi kerana atribut itu bersifat sementara, nilai itu tidak dihantar ke aliran keluaran. Jadi atribut SSN bagi objek Pekerja selepas penyahserikatan ialah 0.