java序列化

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();

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

U2FsdGVkX1/WGgnPureZ6GgUVbISdQE9XioKxO4nrmHsZEqRU5tAw5UU4P9j38xD
rO5O8wewQyIYmTuWNufMKDyZjsFIrX8S6IpYA/XZqAfyf/dU/LwZpsoPOtjFui9w
q7Glu+j8SrCtjfTA+f8IGjQB86p2AbKOEKNosoqps1SFUfydYswABt7IVZoCJa/Y
3b7G1XOLIHpgtfqF7EyeeDcHLS+d3VUHBRV1fYHxgQ6hnEfZvi5Raxrs3xYHwgjz
lscbimM57HH/sreqlmTlm2Bkld9SffDEi8F/JkFAT/fjerCR9Q8+aQ8+ZETeDWUQ
CDWPZxqxBDiCicvtA+UNQhx5kq+PzjGZ+lWczmRFs5O1lWDPFGJAXDeRamO1IWbA
/FWXNsWHjZoszrd8HCvMVJe8V3bcy7CH8spbx5ivYA0uZ/MFl1xyT0i48PdoD6Y2
wmBZhAWfyzOKq7CDSfQrm21xt7Mx6xSHh9C51uIcL8Lze5bfu2poCIVKUAqZKPVn
cHEf9AA1UOhh3E6FOgfR7hh3YW0kwQmqWYngr+Tu431LX2G9S6xjDDNQeVSkGAr0
y2NkcrLDd/opBoy2bzSdVWk2RohWrOMUmtukc8HLfdlGh6pJndyCFktKhANqUX7W
30k1IBxv0EJPEvPq7WuzqGnwECXnnPcTotUyIcQD/GyuF4/2DoavD9PSfyQcjVuM
KuqSduJI02xGoYsIgIRSjxDhJFsK5Z2HPVK7OP5RTQjK0OB9DNjxeqAaJ5lKAyh/
Fx99pADiiwFwMpSnvl91Dy0eE8lfNLRGxTSFgWPX2aVS5S7cCMPXfmipdM5VG+lr
5zL1tBoYfp8C/6Wvk1s/Gm6OrWqjmgA3ucG2XA3mbZVQc3BD4UTiJf/BtIuo3QtI
Jrpc9/H5NjJxxdQ8acEho7qW1s+T9M65pbAZ1Sdm+fk4eW9AUb8xFwA0lndkSKWz
5gNI2VnAvD+p8Emx1TZ1brGp7ujtyglYFolHIhb5vyD36Jy3x7qdTZVHo4P7WIy+
+moNRe2Mkmd5FlR6MEojBU4h+4EM20lTZZp/qKcVnBhFKLKxrsiyvo3357nJOSBQ
2MFIi2oJl7n9840+AGjl5EVs6PhLSgeiCx1ZIhO4z07ikyjO/bweki59wsCQEhJ+
WM3TKXpZNxjyPC8bZYIDEIPkcD6EXARP2i/wHq3S9oq4nf7Hug2lk6eCtF1mxeGU
Pw09AOVJuVupVA8W4J9KvzZQ4YltqkSchjEYgK0ALuwbFlwh1aA87H431mUfQVYr
CHplhsmKK1bFI0KGrCArMls7xyRiynNBhkkjNeftvCHo9ovOtEr6Uo+Y6/SOrAw/
00IWmfMxZlNsJ8OuRJ+K/aFjujp4huczBN2FAFMYbcvWo/Ney2V7t8N1d4CG5L+o
v2xVDdiNank8S+Yj1a3568LrFN18LOMv3vBE6xvWVyYoPe3wCnc3mduvdwksFBxf
u8V9EdORJiyJTYVFwqVl6J/1g2JxQv*nPkchVUvwngCtZNvtgbuYuHFQ8G9PROvP
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
G58nNoyT4zjCpHn0VY7GPQ==