美文网首页
Externalizable的用法及与Serializable的

Externalizable的用法及与Serializable的

作者: 慕辙 | 来源:发表于2019-03-17 16:24 被阅读0次

    Externalizable接口

    Externalizable接口扩展自java.io.Serializable接口。实现java.io.Serializable即可获得对类的对象的序列化功能。而Externalizable可以通过writeExternal()和readExternal()方法可以指定序列化哪些属性。

    Externalizable用法

    创建一个ExternalizableDemo类:

    import java.io.Externalizable;
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectOutput;
    
    public class ExternalizableDemo implements Externalizable {
        private static final long serialVersionUID = 1L;
        private String name;
        private int number;
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeUTF(name);
            out.writeInt(number);
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            this.name = in.readUTF();
            this.number = in.readInt();
        }
    
        public String getName(){
            return this.name;
        }
    
        public void setName(String name){
            this.name = name;
        }
    
        public int getNumber(){
            return this.number;
        }
    
        public void setNumber(int number){
            this.number = number;
        }
    }
    

    定义了一个实现Externalizable接口的 ExternalizableDemo类,在该类中重写了writeExternal()和writeInt()方法

    测试对象序列化和反序列化:

    import java.io.*;
    
    public class ExternalizableTest {
       public static void main(String[] args) {
           try{
               testExternalizable("E://java_training_camp//files//my_file//demo.txt");
           }catch(IOException e){
               System.out.println("输入输出错误");
               e.printStackTrace();
           }catch(ClassNotFoundException e){
               e.printStackTrace();
               System.out.println("找不到该类");
           }
       }
    
       public static void testExternalizable(String OUTPUT_FILE) throws IOException, ClassNotFoundException {
           ExternalizableDemo demo = new ExternalizableDemo();
           demo.setNumber(1004);
           demo.setName("JIH");
           ExternalizableDemo seg = new ExternalizableDemo();
    
           FileOutputStream fileOutputStream = new FileOutputStream(OUTPUT_FILE);
           ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
           demo.writeExternal(objectOutputStream);
    
           objectOutputStream.flush();
           objectOutputStream.close();
           fileOutputStream.close();
    
           FileInputStream fileInputStream = new FileInputStream(OUTPUT_FILE);
           ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
           seg.readExternal(objectInputStream);
    
           objectInputStream.close();
           fileInputStream.close();
       }
    }
    
    

    在上面的测试类中,先创建了一个ExternalizableDemo的对象,并将该对象写入文件。

    Externalizable与Serializable的异同

    1. 序列化内容
      Externalizable自定义序列化可以控制序列化的过程和决定哪些属性不被序列化。
    2. Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器的
    3. 使用Externalizable时,必须按照写入时的确切顺序读取所有字段状态。否则会产生异常。例如,如果更改ExternalizableDemo类中的number和name属性的读取顺序,则将抛出java.io.EOFException。而Serializable接口没有这个要求。

    相关文章

      网友评论

          本文标题:Externalizable的用法及与Serializable的

          本文链接:https://www.haomeiwen.com/subject/hezsmqtx.html