java对象序列化

 java对象序列化概述

  序列化的过程就是对象写入字节流和从字节流中读取对象。

  将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存在文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。

  对象序列化功能可应用在RMI/Socket/JMS/EJB

  简化了对象持久化(Persistence)的实现

  XML序列化指的是把对象转换成XML数据,传输到目的地后再把XML数据反序列化为对象。

对象序列化实用意义

  对象序列化可以实现分布式对象。RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。

  java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的“深复制”,即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

java序列化的实现

  java序列化比较简单,实现Serializable接口的类对象可以转换成字节流或从字节流恢复,不需要在类中增加任何代码。只有极少数情况下才需要定制代码保存或恢复对象状态。

  Serializable是标志性接口,不具有方法。注意:不是每个类都可以序列化,有些类是不能序列化的,例如涉及线程的类与特定JVM有非常复杂的关系。

  java库中的类,如String,都实现了Serializable接口,所以他们都可进行serialization操作。

  对一个对象进行Serialize操作时,不仅会把对象在内存中的数据保存下来,还会把对象中所包含的可serialize成员对象也保存下来。如果对象中包含了没有实现Serializable接口的成员对象,那将在尝试对对象进行Serialize操作时,将发生错误。

  对一个Serializable对象进行次第读取时,并不会调用任何构造函数。这是因为对象中的所有数据都是通过InputStream读取的数据来恢复的,所有不用通过构造函数来进行初始化。

  进行序列读取时,在执行读取操作的class 中一定要能找到相应的class文件。

处理对象流

  java.io包有两个序列化对象的类。

   A. ObjectOutputStream

     将对象写入字节流

     存储对象writeObject()

   B. ObjectInputStream

     从字节流重构对象

     恢复对象readObject()

ObjectOutputStream类

  ObjectOutputStream扩展DataOutput接口writeObject()方法用语对象序列化。如果对象包含其它对象的引用,则writeObject()方法递归序列化这些对象,每个ObjectOutputStream维护序列化的对象引用表,防止发送同一对象的多个拷贝。由于writeObject()可以序列化整组交叉引用的对象,因此同一ObjectOutputStream实例可能不小心被请求序列化同一对象。这时,进行反引用序列化,而不是再次写入对象字节流。

  序列化today's date到一个文件中。

 

FileOutputStream f  =   new  FileOutputStream( " tmp " );
ObjectOutputStream s 
=   new  ObjectOutputStream(f);
s.writeObject(
" Today " );
s.writeObject(
new  Date());
s.flush();

// flush()在方法返回前显示清空输出缓冲区

 

ObjectInputStream类

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值