欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

「漫画」避免使用Java序列化

程序员文章站 2022-04-02 10:46:46
...

原创:享学课堂讲师

转载请声明出处!

「漫画」避免使用Java序列化

「漫画」避免使用Java序列化

「漫画」避免使用Java序列化

「漫画」避免使用Java序列化

「漫画」避免使用Java序列化

「漫画」避免使用Java序列化

「漫画」避免使用Java序列化

下面我们就一起来看看 JDK 默认的序列化到底存在着哪些缺陷:

 

1. 无法跨语言

Java 序列化目前只适用基于 Java 语言实现的框架,其它语言大部分都没有使用 Java 的序列化框架,也没有实现 Java 序列化这套协议。因此,如果是两个基于不同语言编写的应用程序相互通信,则无法实现两个应用服务之间传输对象的序列化与反序列化。

 

2. 易被攻击

Java 官网安全编码指导方针中说明:“对不信任数据的反序列化,从本质上来说是危险的,应该予以避免”。可见 Java 序列化是不安全的。

 

3. 序列化性能太差

序列化的速度也是体现序列化性能的重要指标,如果序列化的速度慢,就会影响网络通信的效率,从而增加系统的响应时间。我们再来通过下面这个例子,来对比下 Java 序列化与 NIO 中的 ByteBuffer 编码的性能:

Java 序列化

User user = new User();
user.setUserName("test");
user.setPassword("test");
long startTime = System.currentTimeMillis();
for(int i=0; i<1000; i++)
{
ByteArrayOutputStream os =
 new ByteArrayOutputStream();
ObjectOutputStream out = 
 new ObjectOutputStream (os);
 out.writeObject(user);
 out.flush();
 out.close();
byte
[] testByte = os.toByteArray();
 os.close();
}
long endTime = 
System.currentTimeMillis();
System.out.print("ObjectOutputStream 序列化时间:"+ (endTime - startTime)

ByteBuffer

 

long
 startTime1 = System
.currentTimeMillis();
for(int i=0; i<1000; i++) 
{
ByteBuffer
 byteBuffer = ByteBuffer
.allocate( 2048);
byte[] userName = user.getUserName().getBytes();
byte[] password = user.getPassword().getBytes();
 byteBuffer.putInt(userName.length);
 byteBuffer.put(userName);
 byteBuffer.putInt(password.length);
 byteBuffer.put(password);

 byteBuffer.flip();
byte[] bytes = 
 new byte [byteBuffer.remaining()];
}
long endTime1 = System
.currentTimeMillis();
System
.out.print(
"ByteBuffer 序列化时间:"+ (endTime1 - startTime1)+ "\n");

运行结果:

ObjectOutputStream 序列化时间:38 ByteBuffer 序列化时间:7

通过以上案例,我们可以清楚地看到:Java 序列化中的编码耗时要比 ByteBuffer 长很多

「漫画」避免使用Java序列化

「漫画」避免使用Java序列化

「漫画」避免使用Java序列化

喜欢本文的话可以关注我们的官方账号,第一时间获取资讯。
你的关注是对我们更新最大的动力哦~