java序列化性能测试

在一般的java程序中,经常会把对象进行序列化,但一般我们都是基于JDK自带的java序列化,那么这种序列化的性能到底如何,在我们的网络编程中能否采用这种序列化,来将我们的消息进行传递呢!话不多少,直接贴出代码。

import java.io.Serializable;
import java.nio.ByteBuffer;
/**
 * @FileName Person.java
 * @Description: 编码测试类
 *
 * @Date 2016年3月4日 
 * @author Administroter
 * @version 1.0
 * 
 */
public class Person implements Serializable{
 //默认的序列号ID
 private static final long serialVersionUID = 1L;
 private int userId;
 private String userName;
 public String getUserName() {
  return userName;
 }
 public void setUserName(String userName) {
  this.userName = userName;
 }
 public int getUserId() {
  return userId;
 }
 public void setUserId(int userId) {
  this.userId = userId;
 }
 
 public Person buildUserID(int userId){
  this.userId = userId;
  return this;
 }
 
 public Person buildUserName(String userName){
  this.userName = userName;
  return this;
 }
 /**
  * @Title: codeC 
  * @Description:采用通用的ByteBuffer的通用二进制编码技术将Person对象转成byte数组,用于和
  * java序列化后的码流进行对比
  * @return 
  * @author Administroter
  * @date 2016年3月4日
  */
 public byte[] codeC(){
  //创建一个容量为1024的字节缓冲区
  ByteBuffer buffer = ByteBuffer.allocate(1024);
  //将userName编码为byte序列,并将结果存储到value byte数组中
  byte[] value = this.userName.getBytes();
  buffer.putInt(value.length);
  buffer.put(value);
  buffer.putInt(this.userId);
  buffer.flip();
  byte[] result = new byte[buffer.remaining()];
  //将缓冲区的字节传输给指定的result目标数组中
  buffer.get(result);
  return result;
 }
 
}
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
 * @FileName SerializableTest.java
 * @Description: 
 *
 * @Date 2016年3月5日 
 * @author Administroter
 * @version 1.0
 * 
 */
public class SerializableTest {
 public static void main(String[] args) throws IOException{
  //实例化Person对象
  Person person = new Person();
  //对象赋值
  person.buildUserID(1).buildUserName("张三");
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  //ByteArrayOutputStream转对象输出流
  ObjectOutputStream os = new ObjectOutputStream(bos);
  //因为序列化是基于字节的,调用ObjectOutputStream的writeObject方法将对象序列化
  os.writeObject(person);
  os.flush();
  os.close();
  byte[] b = bos.toByteArray();
  System.out.println("基于java序列化后对象byte数组的大小:" + b.length);
  bos.close();
  System.out.println("基于二进制编码后byte数组的大小" + person.codeC().length);
 }
}

测试结果:

java序列化性能测试_第1张图片

从上面的结果来看,基于JDK的对象序列化性能远远小于传统二进制编码对象,那么在我们的通讯网络编程中,我们又该怎么传递对象呢,下一节我们再来讨论

 

你可能感兴趣的:(序列化,jdk序列化,序列化性能)