Java序列化与持久化

Java 序列化

  • Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
    将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
  • 整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。

ObjectOutputStream 类包含很多写方法来写各种数据类型,但是一个特别的方法例外:

public final void writeObject(Object x) throws IOException

上面的方法序列化一个对象,并将它发送到输出流。相似的 ObjectInputStream 类包含如下反序列化一个对象的方法:

public final Object readObject() throws IOException, 
                                 ClassNotFoundException

该方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,你需要将它转换成合适的数据类型。

JDK类库提供的序列化API
  • java.io.ObjectOutputStream:表示对象输出流
    它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

  • java.io.ObjectInputStream:表示对象输入流
    它的readObject()方法从源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。

为了演示序列化在Java中是怎样工作的,我将使用之前教程中提到的Employee类,假设我们定义了如下的Employee类,该类实现了Serializable 接口。
Employee.java 文件代码:

public class Employee implements java.io.Serializable{
	public String name;
  		public String address;
   		public transient int SSN;
   		public int number;
   		public void mailCheck(){
   		System.out.println("Mailing a check to " + name + " " + address);
   }
}

● 科幻片里,有两个常见的场景:场景一、远程传输,一个人站在传输带上,一按按钮, 马上传输到另外一个地方,在远端,自动重新组装成原来的那个人 , 完全无损, 没有一个分子传输失败。人是一个对象, 对象为甚么可以无损传输呢, 因为这个对象可以序列化 。可以把这个对象序列成一个串,到了合适的世界,反序列化后,又可以变回来 。有些对象可以序列化,有些对象无法序列化。

● 所有的java 的基础变量,都可以序列化。有些对象,是和当地的环境相关的,无法序列化。

● 序列化,本质上,就是把对象转化成二进制流;反序列化,二进制流 回到对象

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程,序列化是为了解决对象的传输问题,传输可以在线程之间、进程之间、内存外存之间、主机之间进行。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

Java持久化

● 冷冻技术, 一个人冰冻起来, 解冻后,马上回复冰冻前的所有状态 。可以持久保存的,叫做持久化

● 程序运行后,程序的执行结果,存储成文件,这个过程叫做 持久化

● 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。持久化是将程序数据在持久状态和瞬时状态间转换的机制。

序列化与持久化的区别

持久化是希望能把文件持久保存起来并在需要的时候再得到,而序列化关心的是如何把对象变为字节流。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值