首页 > 代码库 > Java网络编程-对象编解码方案、优劣对比

Java网络编程-对象编解码方案、优劣对比

书籍推荐:

  实例代码 : http://download.csdn.net/detail/jiangtao_st/7677503

  1.  用户对象

    /**
     *
     * <p>
     *用户实体对象定义
     * </p>
     *
     * @author 卓轩
     * @创建时间:2014年6月20日
     * @产品: UIC
     * @version: V1.0
     */
    public class UserDO implements Serializable {
    
    	private static final long serialVersionUID = 7289036533757178921L;
    
    	/**
    	 * userid
    	*/
    	private int userId;
    
    	/**
    	 * email
    	*/
    	private String email;
    
    	/**
    	 * uname
    	*/
    	private String uname;
    
    	/**
    	 * unick
    	*/
    	private String unick;
    
    	/**
    	 * sex
    	*/
    	private Integer sex;
    
    	public int getUserId() {
    		return userId;
    	}
    
    	public void setUserId(int userId) {
    		this.userId = userId;
    	}
    
    	public String getEmail() {
    		return email;
    	}
    
    	public void setEmail(String email) {
    		this.email = email;
    	}
    
    	public String getUname() {
    		return uname;
    	}
    
    	public void setUname(String uname) {
    		this.uname = uname;
    	}
    
    	public String getUnick() {
    		return unick;
    	}
    
    	public void setUnick(String unick) {
    		this.unick = unick;
    	}
    
    	public Integer getSex() {
    		return sex;
    	}
    
    
    	public void setSex(Integer sex) {
    		this.sex = sex;
    	}
    
    	@Override
    	public String toString() {
    		return "UserDO ["+this.userId+"],["+this.uname+"],["+this.unick+"],["+this.email+"]";
    	}
    
    	public byte [] coder(){
    
    		ByteBuffer buffer = ByteBuffer.allocate(1024);
    		
    		byte [] email = this.email.getBytes();
    		buffer.putInt(email.length);
    		buffer.put(email);
    		
    		byte [] uname =this.uname.getBytes();
    		buffer.putInt(uname.length);
    		buffer.put(uname);
    		
    		byte [] unick = this.unick.getBytes();
    		buffer.putInt(unick.length);
    		buffer.put(unick);
    		
    		buffer.putInt(this.sex);
    		buffer.putInt(this.userId);
    		
    		buffer.flip();
    		byte[] result = new byte[buffer.remaining()];
    		buffer.get(result);
    		return result;
    	}
    
    }

  2.  对比方案

    /**
     * 
     * <p>
     * 	对比对象编解码 优劣
     * 
     *  代码通过从同一个对象,使用jdk序列化 和 二进制编解码 ,从执行时间,产生的字节大小作对比
     * </p>
     * 
     * @author 卓轩
     * @创建时间:2014年7月8日
     * @version: V1.0
     */
    public class ObjectCoderCompare {
    
    	/**
    	 * 对比序列化文件大小
    	 */
    	@Test
    	public void sizeByteCompare(){
    		
    		try {
    			UserDO zhuoxuan = new UserDO();
    			zhuoxuan.setUserId(113445);
    			zhuoxuan.setSex(1);
    			zhuoxuan.setUname("卓轩");
    			zhuoxuan.setUnick("zhuoxuan");
    			zhuoxuan.setEmail("zhuoxuan@mogujie.com");
    			
    			System.out.println("byte array 序列化大小:" + zhuoxuan.coder().length);
    			
    			//jdk 序列化对象
    			ByteArrayOutputStream bos = new ByteArrayOutputStream();
    			ObjectOutputStream objectOutputStream = new ObjectOutputStream(bos);
    			objectOutputStream.writeObject(zhuoxuan);
    			objectOutputStream.flush();
    			objectOutputStream.close();
    			byte[] byteArray = bos.toByteArray();
    			System.out.println("jdk序列化对象大小:" + byteArray.length);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 执行时间,性能对比
    	 */
    	@Test
    	public void performCompare(){
    		
    		try {
    			UserDO zhuoxuan = new UserDO();
    			zhuoxuan.setUserId(113445);
    			zhuoxuan.setSex(1);
    			zhuoxuan.setUname("卓轩");
    			zhuoxuan.setUnick("zhuoxuan");
    			zhuoxuan.setEmail("zhuoxuan@mogujie.com");
    			
    			long startTime = System.currentTimeMillis();
    			int count = 1000000;
    			for (int i = 0; i < count; i++) {
    				zhuoxuan.coder();
    			}
    			long endTime = System.currentTimeMillis();
    			System.out.println("byte array 执行时间:" + (endTime-startTime) + "ms");
    			
    			startTime = System.currentTimeMillis();
    			for (int i = 0; i < count; i++) {
    				//jdk 序列化对象
    				ByteArrayOutputStream bos = new ByteArrayOutputStream();
    				ObjectOutputStream objectOutputStream = new ObjectOutputStream(bos);
    				objectOutputStream.writeObject(zhuoxuan);
    				objectOutputStream.flush();
    				objectOutputStream.close();
    				byte[] byteArray = bos.toByteArray();
    			}
    			endTime = System.currentTimeMillis();
    			System.out.println("jdk 序列化对象 执行时间:" + (endTime-startTime) + "ms");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    }


  3. 运行结果

    byte array 序列化大小:54

    jdk序列化对象大小:267