在一般的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);
}
}
测试结果:
从上面的结果来看,基于JDK的对象序列化性能远远小于传统二进制编码对象,那么在我们的通讯网络编程中,我们又该怎么传递对象呢,下一节我们再来讨论