What is the difference between Serializable and Externalizable in Java?

后端 未结 11 1117
轻奢々
轻奢々 2020-11-22 12:31

What is the difference between Serializable and Externalizable in Java?

11条回答
  •  执念已碎
    2020-11-22 13:05

    There are so many difference exist between Serializable and Externalizable but when we compare difference between custom Serializable(overrided writeObject() & readObject()) and Externalizable then we find that custom implementation is tightly bind with ObjectOutputStream class where as in Externalizable case , we ourself provide an implementation of ObjectOutput which may be ObjectOutputStream class or it could be some other like org.apache.mina.filter.codec.serialization.ObjectSerializationOutputStream

    In case of Externalizable interface

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(key);
        out.writeUTF(value);
        out.writeObject(emp);
    }
    
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        this.key = in.readUTF();
        this.value = in.readUTF();
        this.emp = (Employee) in.readObject();
    }
    
    
    
    
    
    **In case of Serializable interface**
    
    
            /* 
                 We can comment below two method and use default serialization process as well
                 Sequence of class attributes in read and write methods MUST BE same.
            // below will not work it will not work . 
            // Exception = java.io.StreamCorruptedException: invalid type code: 00\
                  private void writeObject(java.io.ObjectOutput stream) 
                  */
                private void writeObject(java.io.ObjectOutputStream Outstream)
                        throws IOException {
    
                    System.out.println("from writeObject()");
                    /*     We can define custom validation or business rules inside read/write methods.
     This way our validation methods will be automatically 
        called by JVM, immediately after default serialization 
        and deserialization process 
        happens.
                     checkTestInfo();
                    */
    
                    stream.writeUTF(name);
                    stream.writeInt(age);
                    stream.writeObject(salary);
                    stream.writeObject(address);
                }
    
                private void readObject(java.io.ObjectInputStream Instream)
                        throws IOException, ClassNotFoundException {
                    System.out.println("from readObject()");
                    name = (String) stream.readUTF();
                    age = stream.readInt();
                    salary = (BigDecimal) stream.readObject();
                    address = (Address) stream.readObject();
                    // validateTestInfo();
                }
    

    I have added sample code to explain better. please check in/out object case of Externalizable. These are not bound to any implementation directly.
    Where as Outstream/Instream are tightly bind to classes. We can extends ObjectOutputStream/ObjectInputStream but it will a bit difficult to use.

提交回复
热议问题