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)能让你像调用自己机器上的对象那样去调用其它机器上的对象。
最新文章
- 重新梳理HTML基础知识
- 真机测试-Please enter a different string错误解决
- iis 错误解决汇集
- 识别有效的IP地址和掩码并进行分类统
- [Z] 关于c++ typename的另一种用法
- VS2013 编译程序时提示 无法查找或打开 PDB 文件
- 可扩展Web架构与分布式系统
- 对于python的内存管理的好文章
- 关于label和input对齐的那些事
- C语言博客作业—嵌套循环
- git merge与 git rebase区别及实例
- Python爬虫入门教程 61-100 写个爬虫碰到反爬了,动手破坏它!
- Python Learning: 01
- Pandas库中的DataFrame
- JS_高程5.引用类型(1)Object类型
- Flash饼状图统计代码
- VC调试小结
- Linux命令之乐--iconv
- 软件工程 wc.exe 代码统计作业
- windows控制台程序——关于UNICODE字符的总结(转)
热门文章
- .NET下 JSON 的一些常用操作
- 【2018 Multi-University Training Contest 3】
- python之-- socket 基础篇
- 洛谷——P1347 排序
- [Bzoj1297][Scoi2009 ]迷路 (矩阵乘法 + 拆点)
- web应用启动的时候SpringMVC容器加载过程
- Spring Boot中实现logback多环境日志配置
- foobar2000 iOS使用,并连接PC的歌曲进行播放
- html5 拖拽元素
- 系统优化(一)Maven打包同一个jar有不同的:版本号+时间戳(解决思路)