在这里提出Serializable的应用场景。serialVerisonUID值是什么,以及其作用。
1.序列化和反序列化的应用场景
一、序列化和反序列化通过运用于实现RPC架构中,将一个对象转化字节流在网络中进行传输或存入数据库、硬盘中。例如:JSON对象需要转化为字节码进行网络传输。如MyBatis进行对象持久化时,其接口传入自定义对象后,将对象的属性进行序列化成字节码存入数据库。
二、在实现对象的深克隆中,也应用java对象序列化的形式进行。
2.在序列化中的实际应用使用
一、在java.lang.String类,其实现了对其Serializable接口,并且其自定义了serialVersionUID属性。代码如下:
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
其serialVersionUID作用是:实现了Serializable接口的类,在进行对象创建的时候,JVM会自动帮忙进行对象的序列化操作,并且会根据其类的属性情况生成一个serialVersionUID(该属性可以理解为,当前类版本的信息)。在进行对象反序列化操作时,JVM会根据对象字节码生成对应的Java对象的同时,会生成当前类版本的serialVersionUID。并且比较序列化前和反序列化后的serialVersionUID,如果两种serialVersionUID相同,即可证明序列化成功。否则序列化失败,并会抛出异常。(这种在实际开发中也会遇到,1、在开发RPC服务中,由于可能出现修改了类,没及时进行同步到每台服务器中,导致部分服务器对对象字节码无法正常反序列化成对应的对象。2、也有可能类进行迭代中,添加了部分属性,导致原本存在硬盘中的字节码对象进行序列化不成功。)
所有,在String类中,其通过自定义一个Static类型的serialVersionUID,保证不管如何JVM生成的serialVersionUID都是被serialVersionUID所替代,保证序列化和反序列化生成的serialVerisonUID都相同,不会抛出相应的异常。
3、序列化由那些属性不能被序列化的
一、被static修饰的类属性是不能被序列化的,因为该属性初始化前与对象的生成,所有jvm再对象生成时不进行序列化。
二、被transient修饰的属性是不能被序列化的。
今天天气还好晴天,但啊展内心压力庞大,就因找工作问题导致心烦意乱,顿时感觉人生迷茫。打算开始边不断投简历,不断写相应的技术博客,不断的准备公务员考试。不管以后会不会继续走it,能不能让我走it,我都不会放掉我个人的技能。只希望不负付出的努力,不负韶华。道路千万条,认真走好自己的路我就觉得可以了,但人生可能就是在调戏你,考验你。但还是放好心态,坚持或许就会有吧。“或许“也是一种希望吧。