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/MmJFVuM3VsdmXPQ02xk+F7tVpO2gM+v1rugNWaQMrzZNPw+i5k9GP
E6NK1eyv2vJqQmeU6TqVw0SOnAc+PhezxKqCKSrzYDQmMbWmQhYJI2A4ujhdRQ9s
VIK8dIpQ0D9Eadxm1xZU3kGUwee3BnNbBCwBbhq590O6ChgAxUHDzkcSalB1T49i
Q0dA10U4H2uddYW9076N5qjpbvEgtA5C7ndG8Xy81KAK4rAd5q+emEjibrNQybI6
w8BxGJvzxtvp4h0iQh/BunR7WmCk1THsZHvtAUeHW3XhjemBjxwWFpMvnmrGh1GM
kft0N0LR8Mu2VbR2dQsp5Hh5DnMG8kk8kHJu0egf2yh3PGqYdUWlU6jFaQYCYMIc
YEtNaay+zYoF3+sstWhCq7Z5UdMUVAtnEu9VRjq8Z72/PnqKSg4oQDIT3cYflcl5
/5L+VDrINAQh6Tar5goRcT64Y709rlIYtOPZ9r8tpjCNSh0gHGdnEBLwVr8bq9Mo
iV45nTtYNuuOcPhHYXMoxso7IpzIod0jLaoR/AujjOPBU/iUqT2ZamTHeUyY0sHP
cV/qDDHHZEdVZ6rdo/qepX2VIiXXR3EpxJGdWcPo9kynnUxDruBGt9SMpB1MQIyO
0R3PyMsb/njaSGJzxsoqzS3FYaAx2HREGvSmXJT/UoBvaWiFS6qqilfDIApCNkAp
FSOf+oR28wiTX8MBp1+RU0dc6iLWWeeq40rU7lHf9OlbpA3b5lAl/PWsvZo3fkKy
q+FH7XXQUPbQZXSQtVuiYVa//bbHB6w0yyt4ZvkOOipnfg6GkmfKIJNRrnxT5Z7J
4yyVyIQTLE3Ra9Gr/RVnT3Kjh2Kkru1SDvusMUU/yk14nmSKxjuc3SXuy4QYKeUo
suU6TqZ1E8AVmvMUL4O8cs/AaeD2A7fqtbGD7mMGQLEddMg5dvEZ1wDQWD8SBQ+J
/fpyvZIca0mSx2IRtAzM1YnZK0ajpQCuuL3XdPY7SCdpHp2EsuGwdiNt1tYISXvz
58Qu01DpAXulxC4QecxbiKTgyZvz7OSiGvV0wuGet4NZ4hRDcLqd9ixsuWPuVOTj
32KHIt84Dolk5+m7CDqEe7AcgSA2Fxmu+oFzY21Zb/WwamF8hwN9sRH3mmoMY2+7
454fzzzednYil1OSA0LmcmhGr53DW349qACGxE2x3rcFMaC3N7Hf6994gnfOkNDC
Q5qqfDplDfq3jNKq49jOri7hTiVbNr45SxuYucZwQ0XTHGyiC25r2PRog7lvIG9q
hJLU2PxJCAEmlypqIIu8TpYdFb0hVeFuPqTikZE5CLtwQCao2YAGkWWPU01wlNqN
GMQlf3ErlAq3HU/mwJ7D3yEfV36E5jSdznJyGziodkH7PW4pM6fcTNxuvO2tnb4g
ZYEJ02iE6izH2FnyJMtLKxEc/mzxqcj8MPnwisg36Ic/bUS2Vo9YLae9uPOunatN
bHg8t0awkONYX3U7zgKltnnjFHAyFmm+6PC//bNu28gHLp2mXwnSXgd67pgroEbz
XMk2b78dXKcNiQQ7y3PAaBKsBnf+ABHx5XkaHRgYRtt2WqfGc92uroXnxhpzn56J
S4Q4Zadi5cRWI8vsGX0AfVUI01J8IppExBioVn0nuPRrCgcVW6tBCvX4r7y4w61c
IP0Txau3EXvnYNfFRvnxgaekiTd7vjfGSbHzzqFDtVo5plcM0FNsMuzFcipPZcj2
pyjKydu2Y5Ref+kcvj6VZJG8Sx3YoDZLrFBmH5Ra3rfv*n50Cc1iW6iPJTcWqLXb
4PZdl1g4udIpA5QsCY96AU6LkuKDcY+DDDr9HwQ4WgwSr4qsYkXBgj6PZc5GDm8u
6T6l0mVCHSkiD3zrWs5v5kLGp64VTztToNJ2cyKBvljOKydwhO7AMearghIzYvxJ
XpeS5pkoUrJBEzIIX+IaSkYbMwuaCWC8Y1o1qKf2FHFJyKjMToyHLeQTTrSmZZuc
hN/VvTXXhF4nNvAUltMnchyMmrJsM8H5zMtRGoCQ1sqDfaDCMPtyVr9cKChDwzer
eGBX3RGU7w0IpOsR4VU4KTirAvFf7PIntJa5rvUFe8dWA/wRICo0KhNvwTXfkuRA
Wfnz09fa+LJ1D9Hl/UoHBy7XvCY9coWeXt5pyz9W6Xu0axbjY9G+zh/WEwd1nG8/
0jkTW5mb1PVwwPQGDkB2J8psNp3UR8V4XCo3PFzee++qyd3SD7ICnpr33bmt1tBQ
qPUWsVX/GxZfte+vygBXClo9X2rmcBy7ntkfa8VN0NtGREwu7mvS5kZfEwEJIXFN
yZErOjC+u4ovN9ZA0bknSZaoOxVUNDBo7uTQWx0T4L+Zf1emno/9LEGheabyChvG
PzJCjU3BRYBrr0Mkkg6xmiWdZHxr6I/lfZIEqwGsTpF62acxNPYK5zZy/MOtRPCy
b1dSz3W2w6qE0wAjvM7I5nMCwIy8sF/bXu/0ILo43GnuYtdMe66t0Lh03FY73DBM
+YByEbnBkDacIORSOUjSHh6vBe9Kfi58PgaTrYjIAidNpgaT3Nw3eNU8U4//skEN
7YYKH+DkW1zJdULmTZTrwHHp3ihsTvk58OEx2VVyDoV7GbDx1aClyz3xwMSLDQbp
kP/6LazrRhJrTqcloWC40JafMP03C0QBJ6e0eipmDSBZFESJgog+kAWErLm0rsFO
YCOlQpQiD1HwPBvDx+UOig+teamL32LTu/sSEfxsza3dPrSHZONrGKVdcVVuIsaO
9ZkZ1AfTt4P1ARCOpxyg7drD0wBDvPMTZLdCt07QM0ApSPMLnCjVrKwKHRMjvrQV
YsOFmAk/NmnaYi2CSv3HGPQ3dvhjx5+zUWsJv04lsIzDZRF2RA29vi2g1tQe9NRt
8O7ztgWwDHv7rpA0GFnnsIQUaJJohszenRWiiE+I2FngKwz9y5b36uiNEq/TGFIk
NNO0rqMnYXfCULYXyj4yKJ5iy05KC2MhEgfJGIu9WUrC3OcuTHmKTwmMyE9eIkmC
2DX+3oTWHWO6tzXWjA7qagxxNLY0XfxQKhMdV5s7Q9ksYGZ5UiCGn+ueEVKqWC2R
y1erHaWpKZSvsOFVm6tdl6vFSZxHv16R8j3GnJ6pDfbf0IEkCa0dzK5a6JgfwtlS
5tsEZxgv4RLGxzpxEhudTz8hy6G/M+4YME4701aR9Y1guY/xCow8xAtD2Ggo1AxY
6WzihgUn3yxgAG2LW0nkrx6fJoXp20wxFevN3rGq4Pu1t+wt6Xo2rY37Te7IQ3Vy
PeOQ1LeM7FFG/Z/XFVibtfdUpjuQwrqkcRIjhKdQxz4/4kc419Vr/6bFkemgxpdq
UYtOqSzX4PvBGwsrgDNoGGqqLdaBTszq1OqNveSv/BfCk8/zLKGbN1AusF0CQle4
r5xsRMxwj/Zk96GFURx4rIMjswWDfXnGbtAkzxNv8WgkZq73fFT56UeZ6K5bBwY5
ZNGRyszzDMDRKXY5IsJtkOcy4YIgOLP/16tZPvzjRnnjYI/r4ShIIjiqpjzkpzYv
iGqzIbvXbnUaVbvGfzp/Xqc3aLG2+z08a/ubl+qTf7904qyOew9kfENaKEGQBZMT
h3Dkyw1bVEYT3DKXespXHsG+VKFMmEBbe556suVODJmZ0Vgloki6hntyK6k4xfRZ
NyxUPHmSdpMHRK39LJmFBsjKAnyySq0E36SBr91CV/Q=