U ovom POST-u će biti objašnjen primer korišćenja java.io.Serializable.
Serializable
Java Serializable interfejs (java.io.Serializable) je marker interfejs koji vaše klase moraju implementirati ako želite da ih serijalizujete i deserijalizujete. Serijalizacija (pisanje) Java objekata se vrši pomoću ObjectOutputStream, a deserijalizacija (čitanje) se vrši pomoću ObjectInputStream.
Pogledajmo primer sa klasom Person koja je serializable. Ova klasa prepisuje funkciju readObject, tako da kada se deserijalizuje bilo koji objekat ove klase, ova funkcija će biti izvršena.
U primeru, funkcija readObject klase Person poziva funkciju eat() njegovog ljubimca, a funkcija eat() psa (iz nekog razloga) poziva calc.exe. Videćemo kako da serijalizujemo i deserijalizujemo objekat Person da bismo izvršili ovaj kalkulator:
importjava.io.Serializable;importjava.io.*;publicclassTestDeserialization {interfaceAnimal {publicvoideat();}//Class must implements Serializable to be serializablepublicstaticclassCatimplementsAnimal,Serializable {@Overridepublicvoideat() {System.out.println("cat eat fish");}}//Class must implements Serializable to be serializablepublicstaticclassDogimplementsAnimal,Serializable {@Overridepublicvoideat() {try {Runtime.getRuntime().exec("calc");} catch (IOException e) {e.printStackTrace();}System.out.println("dog eat bone");}}//Class must implements Serializable to be serializablepublicstaticclassPersonimplementsSerializable {privateAnimal pet;publicPerson(Animal pet){this.pet= pet;}//readObject implementation, will call the readObject from ObjectInputStream and then call pet.eat()privatevoidreadObject(java.io.ObjectInputStream stream)throwsIOException,ClassNotFoundException {pet = (Animal) stream.readObject();pet.eat();}}publicstaticvoidGeneratePayload(Object instance,String file)throwsException {//Serialize the constructed payload and write it to the fileFile f =newFile(file);ObjectOutputStream out =newObjectOutputStream(new FileOutputStream(f));out.writeObject(instance);out.flush();out.close();}publicstaticvoidpayloadTest(String file) throwsException {//Read the written payload and deserialize itObjectInputStream in =newObjectInputStream(new FileInputStream(file));Object obj =in.readObject();System.out.println(obj);in.close();}publicstaticvoidmain(String[] args) throwsException {// Example to call Person with a DogAnimal animal =newDog();Person person =newPerson(animal);GeneratePayload(person,"test.ser");payloadTest("test.ser");// Example to call Person with a Cat//Animal animal = new Cat();//Person person = new Person(animal);//GeneratePayload(person,"test.ser");//payloadTest("test.ser");}}
Zaključak
Kao što možete videti u ovom veoma osnovnom primeru, "ranjivost" ovde se javlja zato što funkcija readObject poziva druge ranjive funkcije.