美文网首页
Java基础之Externalizable

Java基础之Externalizable

作者: 一生鎻愛 | 来源:发表于2018-09-20 09:19 被阅读0次

ExternalizableSerializable子类,Serializable接口是将整个对象序列化,而Externalizable接口是可以通过他的的writeExternal()readExternal()方法可以指定哪些属性被序列化和反序列化。

  • Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器
  • transient关键字在此时是失效的
@Slf4j
@Data
public class Teacher implements Externalizable{
    
    private transient String name;
    private int age;
    
    //必须要创建的无参构造方法
    public Teacher(){
        log.info("无参构造器被调用");
    }
    
    public Teacher(String name,int age){
        log.info("you参构造器被调用");
        this.name = name;
        this.age = age;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        name = (String) in.readObject();
    }
    
    public static void main(String[] args) throws IOException {
        try {
            log.info("序列化开始");
            FileOutputStream fos=new FileOutputStream(new File("d://javanewlskd.txt"));
            ObjectOutputStream oos=new ObjectOutputStream(fos);
            oos.writeObject(new Teacher("tom",30));
            oos.close();
            log.info("反序列化开始");
            FileInputStream fis=new FileInputStream(new File("d://javanewlskd.txt"));
            ObjectInputStream ois=new ObjectInputStream(fis);
            Object obj = ois.readObject();    
            log.info("反序列化结果:{}",obj);
            ois.close();
        } catch(Exception e) {
             log.error("序列化程序异常",e);
        } 
    }

}

@data是lombok注解,作用是生成getset方法
@Slf4j也是lombok注解,作用是生成log对象

运行结果

序列化开始
you参构造器被调用
反序列化开始
无参构造器被调用
反序列化结果:Teacher(name=tom, age=0)

可以看出
1.反序列化是调用了无参构造方法
2.transient也是无效的
3.指序列化了nameage没有被序列化

相关文章

网友评论

      本文标题:Java基础之Externalizable

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