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

来源:互联网 发布:剑三藏剑二少捏脸数据 编辑:程序博客网 时间:2024/05/21 22:59
  1.  用户对象

    [java] view plaincopyprint?
    1. /** 
    2.  * 
    3.  * <p> 
    4.  *用户实体对象定义 
    5.  * </p> 
    6.  * 
    7.  * @author 卓轩 
    8.  * @创建时间:2014年6月20日 
    9.  * @产品: UIC 
    10.  * @version: V1.0 
    11.  */  
    12. public class UserDO implements Serializable {  
    13.   
    14.     private static final long serialVersionUID = 7289036533757178921L;  
    15.   
    16.     /** 
    17.      * userid 
    18.     */  
    19.     private int userId;  
    20.   
    21.     /** 
    22.      * email 
    23.     */  
    24.     private String email;  
    25.   
    26.     /** 
    27.      * uname 
    28.     */  
    29.     private String uname;  
    30.   
    31.     /** 
    32.      * unick 
    33.     */  
    34.     private String unick;  
    35.   
    36.     /** 
    37.      * sex 
    38.     */  
    39.     private Integer sex;  
    40.   
    41.     public int getUserId() {  
    42.         return userId;  
    43.     }  
    44.   
    45.     public void setUserId(int userId) {  
    46.         this.userId = userId;  
    47.     }  
    48.   
    49.     public String getEmail() {  
    50.         return email;  
    51.     }  
    52.   
    53.     public void setEmail(String email) {  
    54.         this.email = email;  
    55.     }  
    56.   
    57.     public String getUname() {  
    58.         return uname;  
    59.     }  
    60.   
    61.     public void setUname(String uname) {  
    62.         this.uname = uname;  
    63.     }  
    64.   
    65.     public String getUnick() {  
    66.         return unick;  
    67.     }  
    68.   
    69.     public void setUnick(String unick) {  
    70.         this.unick = unick;  
    71.     }  
    72.   
    73.     public Integer getSex() {  
    74.         return sex;  
    75.     }  
    76.   
    77.   
    78.     public void setSex(Integer sex) {  
    79.         this.sex = sex;  
    80.     }  
    81.   
    82.     @Override  
    83.     public String toString() {  
    84.         return "UserDO ["+this.userId+"],["+this.uname+"],["+this.unick+"],["+this.email+"]";  
    85.     }  
    86.   
    87.     public byte [] coder(){  
    88.   
    89.         ByteBuffer buffer = ByteBuffer.allocate(1024);  
    90.           
    91.         byte [] email = this.email.getBytes();  
    92.         buffer.putInt(email.length);  
    93.         buffer.put(email);  
    94.           
    95.         byte [] uname =this.uname.getBytes();  
    96.         buffer.putInt(uname.length);  
    97.         buffer.put(uname);  
    98.           
    99.         byte [] unick = this.unick.getBytes();  
    100.         buffer.putInt(unick.length);  
    101.         buffer.put(unick);  
    102.           
    103.         buffer.putInt(this.sex);  
    104.         buffer.putInt(this.userId);  
    105.           
    106.         buffer.flip();  
    107.         byte[] result = new byte[buffer.remaining()];  
    108.         buffer.get(result);  
    109.         return result;  
    110.     }  
    111.   
    112. }  

  2.  对比方案

    [java] view plaincopyprint?
    1. /** 
    2.  *  
    3.  * <p> 
    4.  *  对比对象编解码 优劣 
    5.  *  
    6.  *  代码通过从同一个对象,使用jdk序列化 和 二进制编解码 ,从执行时间,产生的字节大小作对比 
    7.  * </p> 
    8.  *  
    9.  * @author 卓轩 
    10.  * @创建时间:2014年7月8日 
    11.  * @version: V1.0 
    12.  */  
    13. public class ObjectCoderCompare {  
    14.   
    15.     /** 
    16.      * 对比序列化文件大小 
    17.      */  
    18.     @Test  
    19.     public void sizeByteCompare(){  
    20.           
    21.         try {  
    22.             UserDO zhuoxuan = new UserDO();  
    23.             zhuoxuan.setUserId(113445);  
    24.             zhuoxuan.setSex(1);  
    25.             zhuoxuan.setUname("卓轩");  
    26.             zhuoxuan.setUnick("zhuoxuan");  
    27.             zhuoxuan.setEmail("zhuoxuan@mogujie.com");  
    28.               
    29.             System.out.println("byte array 序列化大小:" + zhuoxuan.coder().length);  
    30.               
    31.             //jdk 序列化对象  
    32.             ByteArrayOutputStream bos = new ByteArrayOutputStream();  
    33.             ObjectOutputStream objectOutputStream = new ObjectOutputStream(bos);  
    34.             objectOutputStream.writeObject(zhuoxuan);  
    35.             objectOutputStream.flush();  
    36.             objectOutputStream.close();  
    37.             byte[] byteArray = bos.toByteArray();  
    38.             System.out.println("jdk序列化对象大小:" + byteArray.length);  
    39.         } catch (IOException e) {  
    40.             // TODO Auto-generated catch block  
    41.             e.printStackTrace();  
    42.         }  
    43.     }  
    44.       
    45.     /** 
    46.      * 执行时间,性能对比 
    47.      */  
    48.     @Test  
    49.     public void performCompare(){  
    50.           
    51.         try {  
    52.             UserDO zhuoxuan = new UserDO();  
    53.             zhuoxuan.setUserId(113445);  
    54.             zhuoxuan.setSex(1);  
    55.             zhuoxuan.setUname("卓轩");  
    56.             zhuoxuan.setUnick("zhuoxuan");  
    57.             zhuoxuan.setEmail("zhuoxuan@mogujie.com");  
    58.               
    59.             long startTime = System.currentTimeMillis();  
    60.             int count = 1000000;  
    61.             for (int i = 0; i < count; i++) {  
    62.                 zhuoxuan.coder();  
    63.             }  
    64.             long endTime = System.currentTimeMillis();  
    65.             System.out.println("byte array 执行时间:" + (endTime-startTime) + "ms");  
    66.               
    67.             startTime = System.currentTimeMillis();  
    68.             for (int i = 0; i < count; i++) {  
    69.                 //jdk 序列化对象  
    70.                 ByteArrayOutputStream bos = new ByteArrayOutputStream();  
    71.                 ObjectOutputStream objectOutputStream = new ObjectOutputStream(bos);  
    72.                 objectOutputStream.writeObject(zhuoxuan);  
    73.                 objectOutputStream.flush();  
    74.                 objectOutputStream.close();  
    75.                 byte[] byteArray = bos.toByteArray();  
    76.             }  
    77.             endTime = System.currentTimeMillis();  
    78.             System.out.println("jdk 序列化对象 执行时间:" + (endTime-startTime) + "ms");  
    79.         } catch (IOException e) {  
    80.             // TODO Auto-generated catch block  
    81.             e.printStackTrace();  
    82.         }  
    83.           
    84.     }  
    85. }  


  3. 运行结果

    byte array 执行时间:1468ms
    jdk 序列化对象 执行时间:11172ms
    byte array 序列化大小:54
    jdk序列化对象大小:248




    byte array 执行时间:1625ms
    jdk 序列化对象 执行时间:11922ms
    byte array 序列化大小:54
    jdk序列化对象大小:248


    byte array 序列化大小:54
    jdk序列化对象大小:248
    byte array 执行时间:1703ms
    jdk 序列化对象 执行时间:11937ms


    byte array 序列化大小:54
    jdk序列化对象大小:248
    byte array 执行时间:1562ms
    jdk 序列化对象 执行时间:12266ms


0 0
原创粉丝点击