java对象序列化的理解

Posted dream_sky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java对象序列化的理解相关的知识,希望对你有一定的参考价值。

1.java中的序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列          化(下面是一个测试的例子)

(实体带versionUUID,便于反序列化时不会报错。)

2.也是最应该注意的,如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象               是先被序列化的对象,不要先接收对象B,那样会报错.尤其在使用上面的Externalizable的时候一定要注意读取               的先后顺序。            

3.实现序列化接口的对象并不强制声明唯一的serialVersionUID,是否声明serialVersionUID对于对象序列化的向              上向下的兼容性有很大的影响

序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性

 

一般实体化序列化的目的有两个,第一个是便于存储,第二个是便于传输。只有将类序列化,才能够针对该类进行读写操作

第一:存储媒体里面,是否是有其相对应的数据结构

第二:这个实体类,是否需要远程传输(或者两个不同系统甚至是分布式模块之间的调用,针对nosql)?

 

使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。

除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。

无论是实现Serializable接口,或是Externalizable接口,当从I/O流中读取对象时,readResolve()方法都会被调用到。实际上就是用readResolve()中返回的对象直接替换在反序列化过程中创建的对象。

序列化之后,转化为一组字节,可以在网络上,他人才可以访问。

private transient String name ;// 声明name属性,但是此属性不被序列化

用途:

1、以前只是知道序列化以后,可以通过io流的方式将对象序列化和反序列化,进行存取;

 用文件流来存储对象,如果对象未序列化,会报错:

java.io.NotSerializableException: com.rfcd.distribution.serviceImpl.Person

2、对象转换成一组byte,这样日后要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了(自动补偿操作系统方面的差异。也就是说,你可以在Windows机器上创键一个对象,序列化之后,再通过网络传到Unix机器上,然后在那里进行重建)

3、通过"将做过序列化处理的对象写入磁盘,等到程序再次运行的时候再把它读出来",你可以达到persistence的效果。

4、Java的远程方法调用(Remote Method Invocation简称RMI)能让你像调用自己机器上的对象那样去调用其它机器上的对象。

 

以上是关于java对象序列化的理解的主要内容,如果未能解决你的问题,请参考以下文章

java对象序列化的理解

java理解java对象序列化

深入理解JAVA I/O系列五:对象序列化

Java IO流--对象流及对象序列化机制的理解

每天进步一点点-Java Serializable(对象序列化)的理解和总结

完全理解Gson:Gson反序列化