Java源码剖析之IO序列化

java基本类型和许多常用库类都实现了Serializable接口,该接口允许我们对实现了其接口的类进行序列化操作,也就是保存对象的状态。我们在下面几种情况经常会使用到序列化:
(1)把一个对象状态保存到文件中
(2)使用套接字传送对象时
(3)通过RMI传送对象时
下面,我们对序列化进行简单介绍。
1.基本类型和实现了Serializable接口的类都允许进行序列化

2.static和transient变量不能被自动保存
对象中的static和transient修饰的变量,不会自动进行状态保存。当我们通过ObjectOutputStream保存对象状态时,这些变量不会被保存。因此通过ObjectInputStream再取出时, transient修饰的变量会为默认值或null(视对象类型)(实际上并没有取出),不过,因为static修饰的是静态变量,它会是当前该static变量的值(从Class中获得)。

3.保存static和transient变量
通过对实现了Serializable的对象增加规定的方法,我们可以保存static和transient变量的当前值。
	public static int i = 1;
	private void writeObject(ObjectOutputStream out) throws IOException{
		out.defaultWriteObject();
		out.writeInt(i);
	}
	private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException{
		in.defaultReadObject();
		i=in.readInt();
	}

上面的例子中。 defaultWriteObject() 方法和 defaultReadObject() 方法只能从正在序列化的类的 writeObject 方法中调用,作用是将当前类的非静态和非瞬态字段写入此流。然后再将需要写入的静态和瞬太变量再写入(读出)即可。 注意,用在static方法时,static变量会改变该类变量的值!

4.Externalizable 完全序列化接口
除了Serializable接口之外,Externalizable接口也可以实现序列化方法。该方法需要完全自己制定序列化方法,也就是说,任何变量都需要亲自决定是否进行保存。具体是实现该接口的
     @Override
     public void writeExternal(ObjectOutput out) throws IOException {
     }
  
     @Override
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    }
上面两个方法。里面的具体实现参考3中的代码。

5.序列化方法并不保存对象方法




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值