2、Hessian(基于HTTP的远程方法调用):
基于HTTP协议传输,在性能方面还不够完美,负载均衡和失效转移依赖于应用的负载均衡器,Hessian的使用则与RMI类似,区别在于淡化了Registry的角色,通过显示的地址调用,利用HessianProxyFactory根据配置的地址create一个代理对象,另外还要引入Hessian的Jar包。
3、Dubbo(淘宝开源的基于TCP的RPC框架)
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
(2)序列化后流的长度比通过缓冲区处理要大的多。
(3)序列化性能太低
三、序列化使用场景
=========
1、分布式传递对象,或者网络传输,需要序列化
2、我调用你的jvm的方法,结果返回到我的jvm上进行处理
3、序列化可以保持对象的状态
比如:tomcat关闭以后会把session对象序列化到SESSIONS.ser文件中,等下次启动的时候就把这些session再加载到内存里面来。
4、数据传输并复原
在j2ee中页面与后台使用的比较多。尤其是在列表中的时候使用尤为突出。
比如:一个人员的列表保存起来的话,你可以将这个列表序列化,传到后台,然后再反序列化成person对象直接进行对象的保存。
5、比如EJB远程调用 分布式存储,缓存存储等
6、像银行卡、密码这些字段不能被序列化
四、序列化和反序列化的注意事项
===============
1、Java序列化的方式
实现 Serializable 接口:可以自定义 writeObject、readObject、writeReplace、readResolve 方法,会通过反射调用。
实现 Externalizable 接口:需要实现 writeExternal 和 readExternal 方法。
2、序列化ID问题
虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)。
3、静态字段不会序列化
序列化时不保存静态变量,这是因为序列化保存的是对象的状态,静态变量属于类的状态,因此序列化并不保存静态变量。
4、transient
transient代表对象的临时数据。
如果你不想让对象中的某个成员被序列化可以在定义它的时候加上 transient 关键字进行修饰,这样,在对象被序列化时其就不会被序列化。
transient 修饰过的成员反序列化后将赋予默认值,即 0 或 null。
有些时候像银行卡号这些字段是不希望在网络上传输的,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
5、父类的序列化
当一个父类实现序列化,子类自动实现序列化;而子类实现了 Serializable 接口,父类也需要实现Serializable 接口。
6、当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化
7、并非所有的对象都可以序列化
(1)安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行RMI传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的;
(2)资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现;
8、序列化解决深拷贝问题
如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存,这是能用序列化解决深拷贝的重要原因。
五、代码实例
======
1、实体类
package javase.transientpackage;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private transient String password;
//construct、setter、getter
}
2、ObjectOutputStream实现序列化和ObjectInputStream实现反序列化
package javase.transientpackage;
import java.io.*;
public class TransientTest {
public static void main(String[] args) {
try {
SerializeUser();
DeSerializeUser();
} catch (IOException e) {
e.printStackTrace();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//序列化
private static void SerializeUser() throws IOException{
## 最后
这次要给大家分享总结的东西就是这些了
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
//序列化
private static void SerializeUser() throws IOException{
## 最后
这次要给大家分享总结的东西就是这些了
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
![image](https://img-blog.csdnimg.cn/img_convert/df2294537c6beddb45bc736fc7097e99.png)