java序列化

在这里插入图片描述

Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

1)Java序列化就是把对象转换成字节序列,而Java反序列化就是把字节序列还原成Java对象。

2)采用Java序列化与反序列化技术,一是可以实现数据的持久化,在MVC模式中很是有用;二是可以对象数据的远程通信。

1.Java序列化与反序列化

Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。

2.为什么需要序列化与反序列化

我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可以的。如何做到呢?这就需要Java序列化与反序列化了。换句话说,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象。

当我们明晰了为什么需要Java序列化和反序列化后,我们很自然地会想Java序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。

3.如何实现Java序列化与反序列化

1)JDK类库中序列化API

java.io.ObjectOutputStream:表示对象输出流

它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream:表示对象输入流

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

2)实现序列化的要求

只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常。

3)实现Java对象序列化与反序列化的方法

假定一个Student类,它的对象需要序列化,可以有如下三种方法:

方法一:若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化

ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。

ObjcetInputStream采用默认的反序列化方式,对对Student对象的非transient的实例变量进行反序列化。

方法二:若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。

ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。

ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。

方法三:若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。

ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。

ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。

4)JDK类库中序列化的步骤

步骤一:创建一个对象输出流,它可以包装一个其它类型的目标输出流,如文件输出流:

ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“D:\objectfile.obj”));

步骤二:通过对象输出流的writeObject()方法写对象:

out.writeObject(“Hello”);

out.writeObject(new Date());

5)JDK类库中反序列化的步骤

步骤一:创建一个对象输入流,它可以包装一个其它类型输入流,如文件输入流:

ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\objectfile.obj”));

步骤二:通过对象输出流的readObject()方法读取对象:

String obj1 = (String)in.readObject();

Date obj2 = (Date)in.readObject();

说明:为了正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致。

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
venwU8+NAFNwaKWoBnwRwg==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值