美文网首页
Externalizable的用法

Externalizable的用法

作者: FoxLayla | 来源:发表于2019-02-23 23:53 被阅读1次

Externalizable的用法

实现了Externalizable接口的类需要重写wirteExternal()方法和readExternal()方法,,这样可以实现自定义方式的序列化和反序列化,而不受限于JVM。

序列化与反序列化

  • 语法:

    • 类实现Externalizable接口

      public class className implements Externalizable {}
      
    • 为类添加表示序列化版本号的静态变量,即

      private static final long serialVersionUID;
      
    • 重写wirteExternal()方法和readExternal()方法,即

      @Override
      public void writeExternal(ObjectOutput out) throws IOException {
          ...
      }
      
      @Override
      public void readExternal(ObjectInput in) 
          throws IOException, ClassNotFoundException {
         ...
      }
      
    • 建立文件流并对该类的实例对象调用writeExternal()方法和readExternal()方法,即

      object.writeExternal(objectOutputStream);
      object.readExternal(objectInputStream);
      
  • 示例:

    实现Externalizable的类:

    public class Person implements Externalizable {
        private static final long serialVersionUID = 1L;
    
        private String name;
        private int age;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return this.name;
        }
    
        public int getAge() {
            return this.age;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeUTF(this.name);
            out.writeInt(this.age);
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            this.name = in.readUTF();
            this.age = in.readInt();
        }
    }
    

    对上述类进行序列化和反序列化:

    public static void main(String[] args) {
          Person person = new Person();
          person.setName("Wang");
          person.setAge(25);
    
          // 序列化
          try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("./docs/Person.txt")))) {
              person.writeExternal(objectOutputStream);
          } catch (IOException e) {
              e.printStackTrace();
          }
    
          // 反序列化
          Person personFromFile = new Person();
          try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("./docs/Person.txt")))){
              personFromFile.readExternal(objectInputStream);
          } catch (IOException | ClassNotFoundException e) {
              e.printStackTrace();
          }
    
          System.out.println(personFromFile.getName().equals(person.getName()) && personFromFile.getAge() == person.getAge());
    }
    
    

Externalizable接口和Serializable接口的区别

  • 责任差异:

    实现Serializable接口的类是由JVM负责序列化其实例对象的,

    而实现Externalizable接口的类由编程人员负责序列化和反序列化

  • 使用情况差异

    当需要序列化整个对象时,使用Serializable接口更方便

    当需要序列化部分对象时,使用Externalizable接口更方法(它可以更便捷的控制如何序列化对象)

  • 性能差异

    Serializable接口性能较差,而Externalizable接口的性能可控

  • 实现自定义序列化方式的差异

    在实现Serializable接口时,通过给字段添加transient关键字可使JVM不序列化该字段,但JVM仍会将该字段的默认值加载进文件中

相关文章

网友评论

      本文标题:Externalizable的用法

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