- serialVersionUID标识了序列化反序列化时的版本
- 静态变量不会参与序列化
- 继承父类,父类不实现Serializable,则父类内的属性不参与序列化,即使父类内的属性是public或protected
- 使用transient关键字阻止序列化实例变量
- Java使用序列化的方法深度克隆,下面是demo:
public class Super implements Serializable {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Super{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Sub implements Serializable {
private String phone;
private Super sper;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Super getSper() {
return sper;
}
public void setSper(Super sper) {
this.sper = sper;
}
@Override
public String toString() {
return "Sub{" +
"phone='" + phone + '\'' +
", sper=" + sper +
'}';
}
public Sub deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream bos = new ObjectOutputStream(baos);
bos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Sub sub = (Sub) ois.readObject();
return sub;
}
public static void main(String[] args) {
Sub sub = new Sub();
sub.setPhone("18922939494");
Super sper = new Super();
sper.setAge(11);
sper.setName("aaaa");
sub.setSper(sper);
try {
Sub cloneSub = sub.deepClone();
System.out.println(sub == cloneSub);
System.out.println(sub.getSper() == cloneSub.getSper());
System.out.println(cloneSub);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}