JavaRush /Blog Jawa /Random-JV /Kepiye Cara Serialisasi ing Jawa
ramhead
tingkat

Kepiye Cara Serialisasi ing Jawa

Diterbitake ing grup
Ing artikel iki, kita bakal nerangake apa serialisasi lan cara kerjane ing Jawa. Cara Serialisasi ing Jawa - 1

Pambuka

Serialisasi obyek yaiku kemampuan obyek kanggo nyimpen salinan lengkap dhewe lan obyek liyane sing dirujuk nggunakake aliran output (contone, menyang file eksternal). Kanthi cara iki, obyek kasebut bisa digawe maneh saka salinan serial (disimpen) mengko yen dibutuhake. Serialisasi obyek, fitur anyar sing dikenalake ing JDK 1.1, nyedhiyakake fungsi kanggo ngowahi grup utawa obyek individu, dadi bitstream utawa byte array, kanggo panyimpenan utawa transmisi liwat jaringan. Lan minangka nyatakake, bit stream utawa byte array bisa diowahi bali menyang obyek Jawa. Iki biasane kedadeyan kanthi otomatis amarga kelas ObjectInputStreamlan ObjectOutputStream. Programmer bisa mutusake kanggo ngleksanakake fungsi iki kanthi ngetrapake antarmuka Serializablenalika nggawe kelas. Proses serialisasi uga dikenal minangka object marshaling , dene deserialization dikenal minangka unmarshaling . Serialisasi minangka mekanisme sing ngidini obyek nyimpen salinan dhewe lan kabeh obyek liyane sing dirujuk dening obyek kasebut menyang file eksternal nggunakake file ObjectOutputStream. Obyek sing disimpen bisa dadi struktur data, diagram, obyek kelas JFrame, utawa obyek liyane, preduli saka jinise. Ing wektu sing padha, serialisasi nyimpen informasi babagan jinis obyek kasebut supaya mengko, nalika deserialized, informasi kasebut digunakake kanggo nggawe maneh jinis obyek sing pas. Dadi, serialisasi nyedhiyakake kemampuan ing ngisor iki:
  • Sistem kanggo nyimpen obyek, yaiku: nyimpen properti menyang file eksternal, disk utawa database.
  • Sistem panggilan prosedur jarak jauh.
  • Sistem distribusi obyek, contone, ing komponen piranti lunak kayata COM, COBRA.
  • Sistem kanggo ngenali owah-owahan ing data variabel liwat wektu.
Kanggo ngerti konsep serialisasi kanthi lengkap, sampeyan kudu duwe pangerten sing jelas babagan rong konsep liyane - ketekunan obyek lan ketekunan benang. Ing kene kita bakal ngomong sethithik babagan saben wong supaya bisa ngelingi. Panjelasan lengkap babagan iki mbutuhake bab sing kapisah kanggo saben konsep kasebut.

Aliran:

Saben program kudu nulis data menyang lokasi panyimpenan utawa pipa, lan saben program kudu maca data saka pipa utawa lokasi panyimpenan. Ing Jawa, saluran iki ngendi program nulis menyang lan saka program maca data diarani Aliran ( Stream) . Cara Serialisasi ing Jawa - 2
Gambar 1. Representasi grafis saka Utas
Aliran utamané dipérang dadi rong jinis:
  • Kelas stream byte sing diarani *Stream
  • Kelas stream karakter sing diarani *Reader lan *Writer
Saben alur panyeratan data ngandhut sakumpulan cara nulis. Lan saben thread maca data, miturut, wis pesawat padha saka cara maca. Sawise thread digawe, kabeh cara iki kudu disebut.

Ketekunan

Ketekunan obyek yaiku kemampuan obyek kanggo urip utawa, kanthi tembung liya, kanggo "urip" saka eksekusi program. Iki tegese samubarang obyek sing digawe nalika runtime dirusak dening JVM scavenger nalika obyek kasebut ora digunakake maneh. Nanging yen API terus-terusan dileksanakake, obyek iki ora bakal numpes dening JVM scavenger, tinimbang padha bakal diijini "urip", kang uga ndadekake iku bisa kanggo ngakses ing wektu sabanjuré aplikasi dibukak. Ing tembung liya, persistence tegese ana umur kanggo obyek, ora gumantung saka umur aplikasi sing lagi mlaku. Salah siji cara kanggo ngleksanakake kegigihan yaiku kanggo nyimpen obyek ing endi wae ing file eksternal utawa database, banjur mulihake ing wektu mengko nggunakake file utawa database minangka sumber. Iki ngendi serialization teka menyang muter. Sembarang obyek non-persistent ana anggere JVM mlaku. Obyek serial mung obyek sing diowahi dadi stream, sing banjur disimpen menyang file eksternal utawa ditransfer liwat jaringan kanggo panyimpenan lan pemulihan.

Implementasi antarmuka Serializable

Sembarang kelas kudu ngleksanakake antarmuka java.io.Serializablekanggo serialize obyek saka kelas sing. Antarmuka Serializableora duwe cara lan mung menehi tandha kelas supaya bisa diidentifikasi minangka serializable. Mung kothak obyek kelas serialized bisa disimpen. Metode utawa konstruktor ora disimpen minangka bagéan saka stream serialized. Yen obyek kasebut minangka referensi kanggo obyek liyane, kolom obyek kasebut uga serial yen kelas obyek kasebut ngetrapake antarmuka Serializable. Ing tembung liyane, graph saka obyek iki dijupuk rampung serializable. Grafik obyek kalebu wit utawa struktur kolom obyek lan subobyek. Loro kelas utama sing mbantu ngleksanakake antarmuka Seriliazable:
  • ObjectInputStream
  • ObjectOutputStream
Listing 1. Conto kelas prasaja kanggo nuduhake serialization
import java.io.*;
public class RandomClass implements Serializable {
 // Генерация рандомного значения
 private static int r() {
        return (int)(Math.random() * 10);
 }
    private int data[];
    // Конструктор
public RandomClass() {
        datafile = new int[r()];
        for (int i=0; i<datafile.length; i++)
        datafile[i]=r();
 }
    public void printout() {
 System.out.println("This RandomClass has "+datafile.length+" random integers");
 for (int i=0; i<datafile.length; i++) {
        System.out.print(datafile[i]+":");
        System.out.println();
    }
}
Ing kode ndhuwur, kelas digawe sing serializable amarga "ditandhani" dening antarmuka serialization. Kelas nggawe array saka wilangan bulat acak nalika Kayata saka iku digawe. Kode ing ngisor iki nuduhake kemampuan kanggo nulis obyek menyang stream nggunakake ObjectOutputStream. Program kasebut nduweni macem-macem integer, nanging kanggo serialisasi, kita ora kudu ngulang obyek internal. Antarmuka Seriliazablengurus iki kanthi otomatis. Listing 2. Conto prasaja saka obyek serializing kanggo output kanggo file
import java.io.*;
import java.util.*;
public class OutSerialize {
    public static void main (String args[]) throws IOException {
        RandomClass rc1 = new RandomClass();
        RandomClass rc2 = new RandomClass();
//создание цепи потоков с потоком вывода an object в конце
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("objects.dat"));
        Date now = new Date(System.currentTimeMillis());
//java.util.* был импортирован для использования класса Date
        out.writeObject(now);
        out.writeObject(rc1);
        out.writeObject(rc2);
out.close();
        System.out.println("I have written:");
System.out.println("A Date object: "+now);
        System.out.println("Two Group of randoms");
rc1.printout();
rc2.printout();
 }
}
Kode ing ngisor iki nduduhake kapabilitas kelas ObjectInputStream, sing maca data serialized saka file external menyang program. Elinga yen obyek diwaca kanthi urutan sing padha nalika ditulis ing file kasebut. Listing 3. Maca obyek serialized utawa Deserializing
import java.io.*;
import java.util.*;
public class InSerialize {
 public static void main (String args[]) throws  IOException, ClassNotFoundException {
    ObjectInputStream in =  new ObjectInputStream (new FileInputStream("objects.dat"));
 Date d1 = (Date)in.readObject();
 RandomClass rc1 = (RandomClass)in.readObject();
    RandomClass rc2 = (RandomClass)in.readObject();
    System.out.println("I have read:");
    System.out.println("A Date object: "+d1);
    System.out.println("Two Group of randoms");
    rc1.printout();
rc2.printout();
 }
}
Meh kabeh kelas Jawa bisa serialized, kalebu kelas AWT. Pigura, yaiku jendhela, ngemot sakumpulan komponen grafis. Yen pigura wis serialized, engine serialization ngurus iki lan serializes kabeh komponen lan data (posisi, isi, etc.). Sawetara obyek kelas Jawa ora bisa serialized amarga padha ngemot data sing referensi sumber daya sistem operasi ephemeral. Contone kelas java.io.FileInputStreamlan java.lang.Thread. Yen obyek ngemot referensi kanggo unsur non-serializable, kabeh operasi serialization bakal gagal lan pangecualian bakal di buwang NotSerializableException. Yen obyek nuduhake referensi saka obyek unserialized, banjur bisa serialized nggunakake tembung kunci transient . Listing 4. Nggawe obyek serializable nggunakake tembung kunci transient
public class Sclass implements Serializable{
public transient Thread newThread;
//помните, что поток(поток параллельного исполнения) по умолчанию не сериализуемый класс
    private String studentID;
    private int sum;
}

Keamanan ing Serialisasi

Serialisasi kelas ing Jawa kalebu ngirim kabeh data menyang file eksternal utawa database liwat stream. Kita bisa matesi data sing bakal serialized kapan kita pengin. Ana rong cara kanggo nindakake iki:
  • Saben parameter kelas sing diumumake minangka transien ora serialisasi (kanthi standar, kabeh paramèter kelas wis serialized)
  • Utawa, saben parameter kelas sing arep kita serialize ditandhani karo tag Externalizable(kanthi standar, ora ana paramèter serialized).
A kolom data ora bakal serialized karo ObjectOutputStream, nalika disebut ing obyek, yen lapangan data obyek wis ditandhani transient . Tuladhane: private transient String password. Ing sisih liya, kanggo nyatakake kanthi jelas data obyek minangka serializable, kita kudu menehi tandha kelas minangka nulis lan maca data obyek kasebut ExternalizablewriteExternalkanthi jelas .readExteranl

Kesimpulan

Fitur serialisasi obyek digunakake ing akeh sistem sing disebarake minangka cara kanggo nransfer data. Nanging serialisasi mbukak rincian sing didhelikake, saéngga ngrusak keaslian jinis data abstrak, sing banjur ngrusak enkapsulasi. Ing wektu sing padha, iku becik kanggo ngerti sing data saka obyek serialized data padha sing ana ing asli, obyek asli. Iki uga minangka kesempatan sing apik kanggo ngleksanakake antarmuka ObjectInputValidationlan ngatasi cara validateObject(), sanajan sawetara baris kode digunakake. Yen obyek kasebut ora ditemokake, mula kita bisa mbuwang pengecualian kanthi tepat InvalidObjectException. Artikel asli: Cara serialisasi ing Jawa
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION