可序列化接口Serializable

Serializable接口是一种标记性接口。因为它没有方法,所以,不需要在类中为实现Serializable接口增加额外的代码。实现这个接口可以启动Java的序列化机制,自动完成存储对象和数组的过程。

为了体会这个自动和理解对象是如何存储的,考虑一下不使用这一功能,储存一个对象需要做哪些工作。假设要存储一个JButton对象,为了完成这个任务,需要存储该对象所有属性(例如,颜色、字体、文本和对齐方式)的当前值。由于JButton是AbstractButton的一个子类,所以,必须把AbstractButton的属性值和AbstractButton所有父类的属性值都存储起来。如果某个属性是对象类型的(例如,background是Color类型的),存储它就要求这个对象的所有属性值。如你所见,这是一个非常烦琐冗长的过程。幸运的量,不必手工完成这个过程。Java提供一个内在机制自动完成写对象的过程。这个过程称为对象序列化,它是在ObjectOutputStream中实现的。与此相反,读取对象的过程称作对象反序列化,它是在ObjectInputStream类中实现的。

许多Java API中的类都实现了Serializable接口。工具类如java.util.Date以及所有的Swing GUI组件类都实现了Serializable接口。试图存储一个不支持Serializable接口的对象会引起一个NotSerializableException异常。

当存储一个可序列化对象时,会对该对象的类进行编码。编码包括类名、类的签名、对象实例变量的值以及从初始对象引用的任何其他对象的闭包,但是不存储对象静态变量的值。

非序列化的数据域:如果一个对象是Serializable的实例,但它包含的都是非序列化的数据域,那么可以序列化这个对象吗?答案是否定的。为了使该对象是可序列化的,需要给这些数据域加上关键字transient,告诉Java虚拟机将对象写入对象流时忽略这些数据域。考虑下面的类:

public class Foo implements java.io.Serializable {
    private int v1;
    private static double v2;
    private transient A v3 = new A();
}

class A {
    ...
 }//A is not serializable

当Foo类的一个对象进行序列化时,只需序列化变量v1。因为v2是一个静态变量,所以没有序列化。因为v3标记为transient,所以也没有序列化。如果v3没有标记为transient,将会发生异常java.io.NotSerializableException。
复制对象:如果一个对象不止一次写入对象流,会存储对象的多份副本吗?答案是不会。第一次写入一个对象时,就会为它创建一个序列号。Java虚拟机将对象的所有内容和序列号一起写入对象流。以后每次存储时,如果写入相同的对象,就只存储序列号。读出这些对象时,它们的引用相同,因为在内存中实际上存储的只是一个对象。
上传一篇网上找的文章,如有不明白可以下载来看~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值