在通常的java程序中,常常会把对象进行序列化,但通常咱们都是基于JDK自带的java序列化,那么这种序列化的性能到底如何,在咱们的网络编程中可否采用这种序列化,来将咱们的消息进行传递呢!话很少少,直接贴出代码。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的对象序列化性能远远小于传统二进制编码对象,那么在咱们的通信网络编程中,咱们又该怎么传递对象呢,下一节咱们再来讨论数组