标签:resolve version 持久化 接口 ring data 结构 自己 创建
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)能让你像调用自己机器上的对象那样去调用其它机器上的对象。
标签:resolve version 持久化 接口 ring data 结构 自己 创建
原文地址:https://www.cnblogs.com/shuchen007/p/9157516.html