序列化性能测试

一、起因
  这次项目中客户端和服务器端的通讯为了简单使用了Java的序列化功能,需要传输的地方直接构造一个HashMap传过去就可了,相当的简单。可是看以前做过的系统中都是使用字符串传输的,要不是直接构造一个特殊的字符串序列,要不就是构造一个xml文件都没有直接使用Java的序列化功能。又听说序列化的性能很差,所以在总结这个项目的客户端与服务端的数据传送之前先调查一下,序列化的性能差多少。
二、测试程序
import  java.io.ByteArrayInputStream;
import  java.io.ByteArrayOutputStream;
import  java.io.ObjectInputStream;
import  java.io.ObjectOutputStream;


public   class  TestSerialize  {

    
public static void main(String[] args) throws Exception {
        String test 
= "this is a string.";
        Integer textInt 
= new Integer(10000);
       
        
// 字符串性能测试
        testSerailize(test);
        testGetBytes(test);
       
        
// 整型性能测试
        testSerailize(textInt);
        testGetBytes(textInt);
       
    }


    
// 序列化
    private static void testSerailize(Object test) throws Exception {
        
long startTime = System.currentTimeMillis();
        
for (int i = 0; i < 1000; i++{
            ByteArrayOutputStream byteArrayOutputStream 
= new ByteArrayOutputStream();
            
new ObjectOutputStream(byteArrayOutputStream).writeObject(test);
            ByteArrayInputStream byteArrayInputStream 
= new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            ObjectInputStream inputStream 
= new ObjectInputStream(byteArrayInputStream);
            inputStream.readObject();
        }

        System.out.println(System.currentTimeMillis() 
- startTime);
    }


    
// 字符串转换为byte数组,在转换为字符串
    private static void testGetBytes(String test) {
        
long startTime = System.currentTimeMillis();
        
for (int i = 0; i < 1000; i++{
            
byte[] bytes = test.getBytes();
            
new String(bytes);
        }

        System.out.println(System.currentTimeMillis() 
- startTime);
    }


    
// Integer->String->byte[]->String->Integer
    private static void testGetBytes(Integer test) {
        
long startTime = System.currentTimeMillis();
        
for (int i = 0; i < 1000; i++{
            
byte[] bytes = test.toString().getBytes();
            Integer.parseInt(
new String(bytes));
        }

        System.out.println(System.currentTimeMillis() 
- startTime);
    }


}

三、测试结果
62
16
141
15
接近10倍的性能优势,怪不得日本人提供的框架都是使用字符串来传输数据的。
序列化和反序列化是计算机科学中的两个重要概念,尤其是在处理数据存储和网络通信时: **序列化**(Serialization)是指将一个复杂的数据结构(如对象)转换成一系列可以存储或传输的易于管理的形式的过程。这个过程通常是将对象的状态信息(如字段值、集合元素等)编码为字符串、字节流或者其他可持久化的格式,以便稍后恢复原始数据结构。 **反序列化**(Deserialization)则是相反的过程,即从上述已序列化的形式中重构出原来的数据结构,还原其状态。这通常用于从存储或网络接收的数据中恢复对象实例。 测试序列化和反序列化主要包括以下几个方面: 1. **数据完整性**:验证经过序列化和反序列化后的数据是否保持了原有的内容和结构,例如,日期时间类型的正确还原,数组和列表元素的顺序是否不变等。 2. **兼容性测试**:针对不同的序列化库或配置,确保数据能在不同环境下正确还原。 3. **性能测试**:测量序列化和反序列化的时间消耗,特别是在处理大数据或频繁操作时的性能。 4. **边缘情况**:测试极端的输入,比如null值、空字符串、超出范围的数值等,看是否会导致错误。 5. **异常处理**:测试序列化过程中遇到错误(如未找到字段、数据格式错误等)时,系统能否正确处理并给出预期的结果。 序列化和反序列化在各种领域都很常见,如JSON、XML、二进制文件、数据库连接池等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值