Java网络编程-对象编解码方案、优劣对比
转载
- 用户对象
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. 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. this.sex);
104. this.userId);
105.
106. buffer.flip();
107. byte[] result = new byte[buffer.remaining()];
108. buffer.get(result);
109. return result;
110. }
111.
112. }
- 对比方案
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. new UserDO();
23. 113445);
24. 1);
25. "卓轩");
26. "zhuoxuan");
27. "zhuoxuan@mogujie.com");
28.
29. "byte array 序列化大小:" + zhuoxuan.coder().length);
30.
31. //jdk 序列化对象
32. new ByteArrayOutputStream();
33. new ObjectOutputStream(bos);
34. objectOutputStream.writeObject(zhuoxuan);
35. objectOutputStream.flush();
36. objectOutputStream.close();
37. byte[] byteArray = bos.toByteArray();
38. "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. new UserDO();
53. 113445);
54. 1);
55. "卓轩");
56. "zhuoxuan");
57. "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. "byte array 执行时间:" + (endTime-startTime) + "ms");
66.
67. startTime = System.currentTimeMillis();
68. for (int i = 0; i < count; i++) {
69. //jdk 序列化对象
70. new ByteArrayOutputStream();
71. new ObjectOutputStream(bos);
72. objectOutputStream.writeObject(zhuoxuan);
73. objectOutputStream.flush();
74. objectOutputStream.close();
75. byte[] byteArray = bos.toByteArray();
76. }
77. endTime = System.currentTimeMillis();
78. "jdk 序列化对象 执行时间:" + (endTime-startTime) + "ms");
79. catch (IOException e) {
80. // TODO Auto-generated catch block
81. e.printStackTrace();
82. }
83.
84. }
85. }
- 运行结果
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