接下来,我们继承编写测试代码,实行将之前耐久化写入user.txt文件的工具数据再次转化为Java工具,代码如下:
- public class SerializableTest {
- /**
- * 将类从文本中提取并赋值给内存中的类
- */
- public static void readObj() {
- try {
- ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/Users/guanliyuan/user.txt"));
- try {
- Object object = objectInputStream.readObject();
- User user = (User) object;
- System.out.println(user);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
-
- public static void main(String args[]) {
- readObj();
- }
- }
通过反序列化操纵,可以再次将耐久化的工具字节约数据通过IO转化为Java工具,功效如下:
- cn.wudimanong.serializable.User@6f496d9f
此时,假如我们再次实行将User实现Serializable接口的代码部门去掉,发明也无法再文本转换为序列化工具,报错信息为:
- ava.io.InvalidClassException: cn.wudimanong.serializable.User; class invalid for deserialization
- at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:157)
- at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:862)
- at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2038)
- at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1568)
- at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428)
- at cn.wudimanong.serializable.SerializableTest.readObj(SerializableTest.java:31)
- at cn.wudimanong.serializable.SerializableTest.main(SerializableTest.java:44)
提醒犯科范例转换非常,声名在Java中怎样要实现工具的IO读写操纵,都必需实现Serializable接口,不然代码就会报错!
序列化&反序列化
通过上面的叙述和示例,信托各人对Serializable接口的浸染是有了较量详细的领会了,接下来我们上层到理论层面,看下到底什么是序列化/反序列化。序列化是指把工具转换为字节序列的进程,我们称之为工具的序列化,就是把内存中的这些工具酿成陆续串的字节(bytes)描写的进程。
而反序列化则相反,就是把耐久化的字节文件数据规复为工具的进程。那么什么环境下必要序列化呢?或许有这样两类较量常见的场景:1)、必要把内存中的工具状态数据生涯到一个文件可能数据库中的时辰,这个场景是较量常见的,譬喻我们操作mybatis框架编写耐久层insert工具数据到数据库中时;2)、收集通讯时必要用套接字在收集中传送工具时,如我们行使RPC协议举办收集通讯时;
关于serialVersionUID (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|