Java基础复习-序列化与transient关键字



Java序列化SYJ思考者日记网-束洋洋个人博客

1、什么是序列化

序列化就是将对象的状态信息转换为可以存储或传输的形式的过程。Java就是将堆中的内存对象通过某种方式转变为可传输(xml、json、二进制数据)、可存储的二进制串的过程。 通俗来讲就是将数据结构或对象转换成二进制串的过程。反序列化就是将二进制恢复成Java对象的过程。SYJ思考者日记网-束洋洋个人博客

 SYJ思考者日记网-束洋洋个人博客

2、什么时候使用序列化

分布式系统需要将对象传输在网络中;文件存储(服务器发现很久没活动的对象就会将其序列化存储在磁盘文件中,当服务器发现某些需要活动时,先去内存中寻找,如果没找到就从磁盘文件中反序列化出来,恢复成Java对象,这样可以节省服务器内存)SYJ思考者日记网-束洋洋个人博客

 SYJ思考者日记网-束洋洋个人博客

3、Java如何使用序列化

  • ①、需要做序列化的对象的类,必须实现序列化接口:(目的告诉Java,这个类可以序列化啦,如果不实现,再序列化的时候就会报异常:java.io.NotSerializableException)Java.lang.Serializable 接口(这是一个标志接口,没有任何抽象方法),Java 中大多数类都实现了该接口,比如:String,Integer
  • ②、底层会判断,如果当前对象是 Serializable 的实例,才允许做序列化,Java对象 instanceof Serializable 来判断。
  • ③、在 Java 中使用对象流来完成序列化和反序列化

ObjectOutputStream:通过 writeObject()方法做序列化操作SYJ思考者日记网-束洋洋个人博客

ObjectInputStream:通过 readObject() 方法做反序列化操作SYJ思考者日记网-束洋洋个人博客

clipboard.pngSYJ思考者日记网-束洋洋个人博客

 SYJ思考者日记网-束洋洋个人博客

4、transient关键字是什么

上面说到序列化,当反序列化的时候,就必须需要提供该对象的字节码文件(byte[])如果某些数据不需要反序列化怎么办?就需要在字段前面加transientSYJ思考者日记网-束洋洋个人博客

随着项目升级修改,可能对序列化对象进行修改了,比如,增加了某个字段。(版本不一致会报InvalidCastException异常) 那么就要在java对象中增加一个serialVersionUID 字段,用来固定这个版本,无论我们怎么修改,版本都是一致的,就能进行反序列化了。SYJ思考者日记网-束洋洋个人博客

具体的序列化过程是这样的:序列化操作的时候系统会把当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会去检测文件中的serialVersionUID,判断它是否与当前类的serialVersionUID一致,如果一致就说明序列化类的版本与当前类版本是一样的,可以反序列化成功,否则失败。SYJ思考者日记网-束洋洋个人博客

这也是Eclipse实现了序列化接口后,不给这个字段会报感叹号的原因。SYJ思考者日记网-束洋洋个人博客

当实现java.io.Serializable接口的类没有显式地定义一个serialVersionUID变量时候,Java序列化机制会根据编译的Class自动生成一个serialVersionUID作序列化版本比较使用,这种情况下,如果Class文件(类名,方法明等)没有发生变化(增加空格,换行,增加注释等等),就算再编译多次,serialVersionUID也不会变化的。SYJ思考者日记网-束洋洋个人博客

如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。SYJ思考者日记网-束洋洋个人博客

 SYJ思考者日记网-束洋洋个人博客

题外话:无意看源码中用到了transient关键字,ArrayList类实现了Serializable接口,add方法中使用的SYJ思考者日记网-束洋洋个人博客

源码.pngSYJ思考者日记网-束洋洋个人博客

源码.pngSYJ思考者日记网-束洋洋个人博客

 

(转载本站文章请注明作者和出处 思考者日记网|束洋洋个人博客 ,请勿用于任何商业用途)

『访问 思考者日记网404页面 寻找遗失儿童』

告知
  •     本站90%以上文章均属原创,部分转载已加上原作者出处。 如需转载本站文章请您务必保留本站出处!
  •     打广告评论者请自重,请为广大网友提供一个健康干净的网络空间。
  •  感谢主机屋提供网站空间;
  •  感谢万网阿里云提供域名解析;
  •  感谢EmpireCMS提供CMS系统;
  •  感谢bootstrap展示本站前端页面;
  •  感谢Glyphicons Halflings提供字体;
  •  感谢大家一直以来对本站的喜爱,感谢大家!
近期文章 建议与反馈

 

网友评论
我也来说两句