Wednesday, 8 July 2015

Externalizable Interface

java.io.Externalizable interface

There are two methods readExternal() and writeExternal() in Externalizable interface those can be used in serialization process.

@Override
public void readExternal(ObjectInput arg0) throws IOException, ClassNotFoundException { }

@Override
public void writeExternal(ObjectOutput arg0) throws IOException { }

Externalizable interface extends Serializable interface.

Need of Externalizable

1.If you are not happy with the way java writes/reads objects from stream.

2.Special handling for super types on object construction during serialization.


import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class Person implements Externalizable {
       private int id;
       private String name;
       private String gender;

       @Override
       public void writeExternal(ObjectOutput out) throws IOException {
              out.writeInt(id);
              out.writeObject(name+"xyz");
              out.writeObject("abc"+gender);
       }

       @Override
       public void readExternal(ObjectInput in)throws IOException, 
                                            ClassNotFoundException{
              id=in.readInt();
              //read in the same order as written
              name=(String) in.readObject();
              if(!name.endsWith("xyz")) {
                     throw new IOException("corrupted data");
              } else {
                     name=name.substring(0, name.length()-3);
              }
              gender=(String) in.readObject();
              if(!gender.startsWith("abc")) {
                     throw new IOException("corrupted data");
              } else {
                     gender=gender.substring(3);
              }
       }
       @Override
       public String toString(){
              return "Person{id="+id+",name="+name+",gender="+gender+"}";
       }
       // Setters and Getters
}

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ExternalizationTest {
       public static void main(String[] args) {
              String fileName = "person.ser";
              Person person = new Person();
              person.setId(1);
              person.setName("Pankaj");
              person.setGender("Male");
              try {
                     FileOutputStream fos = new FileOutputStream(fileName);
                     ObjectOutputStream oos = new ObjectOutputStream(fos);
                     oos.writeObject(person);
                     oos.close();
              } catch (IOException e) {
                     e.printStackTrace();
              }
              FileInputStream fis;
              try {
                     fis = new FileInputStream(fileName);
                     ObjectInputStream ois = new ObjectInputStream(fis);
                     Person p = (Person)ois.readObject();
                     ois.close();
                     System.out.println("Person Object Read= "+p);
              } catch (IOException | ClassNotFoundException e) {
                     e.printStackTrace();
              }
       }
}

No comments:

Post a Comment

Related Posts Plugin for WordPress, Blogger...