Externalizable
是Serializable
子类,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
注解,作用是生成get
、set
方法
@Slf4j也是lombok
注解,作用是生成log
对象
运行结果
序列化开始
you参构造器被调用
反序列化开始
无参构造器被调用
反序列化结果:Teacher(name=tom, age=0)
可以看出
1.反序列化是调用了无参构造方法
2.transient
也是无效的
3.指序列化了name
,age
没有被序列化