前言:
之前敲项目,写类都要序列化一下,一直也没有想过为什么,欠的总是要还的,趁这个下午赶紧学习一下:
正文:
序列化:把对象转为字节的过程、便于存储、传输
反序列化:将字节恢复为对象的过程
需要序列化的时候:
1、将内存对象保存到文件或数据库中;2、用套接字在网络上传送对象;3、RMI传输对象时
通过大师兄博客中的例子,我们可以知道:
1、类中静态属性不序列化
2、实现Serializable 接口(final的long的静态字段)的时候,一定要在类中给 serialVersionUID 赋值
程序运行时通过serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中验证序列化对象的发送、接收者是否为该对象加载了与序列化兼容的类;建议使用private修饰,子类不需要继承,数组类不能声明明确的SerialVersionUID
序列化和持久化一样吗?
肯定不一样,持久化存储到硬盘或数据库、长期存储,序列化为了数据传递短期存储
数据序列化:将对象、数据结构化为特定格式,在网络中传输或存储在内存、文件中;反序列化反之;对象/数据的交换和传输
对象持久化:将对象存储在可持久保存的存储介质上,重点在于如何将业务数据对象存储到持久化介质上,同时提供查询修改手段。
小结:
最近看东西看不下去,需要打出来,打成笔记不如写成博客
注:
套接字(socket)或插口:通信的两方的一种约定,用套接字中的相关函数来完成通信过程,用(IP地址:端口号)表示
协议名+IP+:端口+应用名,为两台计算机之间的通信提供了一种机制
RMI:远程方法调用,让虚拟机上的对象像调用本地对象一样调用另一个虚拟机中的对象上的方法
接口的所有方法都必须抛出RemoteException
核心:远程对象
通信模型
客户端只与代表远程主机对象中的stub对象通信,不知道server的存在,客户端调用stub的方法,stub是本地对象,实现了远程对象向外暴露的接口)(stub远程对象在本地的代理,通过网络传递给远程对象)
数据传递问题:
分布式系统,对象不再存在于同一内存空间
解决:
将引用传递改为值传递:序列化为字节、字节副本在客户端服务器间传递,一个虚拟机中对该值的修改不影响其他主机中的数据,但是对对象的嵌套引用造成序列化的嵌套:数据量激增
满足序列化条件其中之一:1、java基本类型2、实现serializable接口
远程主机调用本地方法时,通过本地主机查询引用对应的对象,在任意太机器上的改变都影响原始主机上的数据,对象共享