java--序列化

Externalizable API 解读

实现该接口的对象,在序列化的时候,会通过它的两个方法去进行序列化。writeExternal 和 readExternal 方法。要存储的每个对象都需要检测是否支持 Externalizable 接口。如果对象支持 Externalizable,则调用 writeExternal 方法。如果对象不支持 Externalizable 但实现了Serializable,则使用 ObjectOutputStream 保存该对象。也就是如果实现了Externalizable 接口,将代替定制的 writeObject 和 readObject 方法实现。

在重构 Externalizable 对象时,先使用无参数的公共构造方法创建一个实例,然后调用 readExternal 方法。通过从 ObjectInputStream 中读取 Serializable 对象可以恢复这些对象。(这段话,有个重点,就是通过实现Externalizable 接口来重构对象,将调用无参的构造函数,如果你的对象有其他的构造函数,默认是不会提供无参,找不到无参构造函数,在重构的时候就会报错

什么情况下使用Externalizable

举个最简单的例子,你通过Serializable 接口来序列化对象,你必须要序列化整个对象的属性,假如这时,有些对象的属性不要序列化,你怎么搞,显然,这时需求就不能完成,这时就可以使用Externalizable ,它可以完全控制某对象的某个属性的序列化,其实到后面还有更简单的方法,用transient关键字。

public class Person1 implements Externalizable {
   private String name;
   private int age;
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}

public Person1() {
    super();
    // TODO Auto-generated constructor stub
}
public Person1(String name, int age) {
    super();
    this.name = name;
    this.age = age;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
    // TODO Auto-generated method stub
    out.writeInt(age);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    // TODO Auto-generated method stub
  System.out.println(in.readInt());
  } 
}

我们只要求序列化Person1对象的age属性,实际上真正序列化的方法是writeExternal。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值