Katika chapisho hili, mfano utaelezwa ukitumia java.io.Serializable.
Serializable
Kiolesura cha Java Serializable (java.io.Serializable ni kiolesura cha alama ambacho darasa zako lazima zitekeleze ikiwa zinapaswa kuserilishwa na kudiserilishwa. Userilishaji wa vitu vya Java (kuandika) unafanywa na ObjectOutputStream na kudiserilishwa (kusoma) unafanywa na ObjectInputStream.
Hebu tuone mfano na darasa la Person ambalo ni linaloweza kuserilishwa. Darasa hili linabadilisha kazi ya readObject, kwa hivyo wakati kitu chochote cha darasa hili kinapodiserilishwa, kazi hii itatekelezwa.
Katika mfano huo, kazi ya readObject ya darasa la Person inaita kazi eat() ya mnyama wake na kazi eat() ya Mbwa (kwa sababu fulani) inaita calc.exe. Tutaona jinsi ya kuserilisha na kudiserilisha kitu cha Person ili kutekeleza kikokotozi hiki:
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");}}
Hitimisho
Kama unavyoona katika mfano huu wa msingi sana, "udhaifu" hapa unaonekana kwa sababu kazi ya readObject inaita kazi nyingine zenye udhaifu.