MessagePack
随着移动互联网的发展,网络编程也就越来越多的被用到,如果是消息传输的话,我想大家大部分会采用JSON的格式传输,也可能采用其它的格式,但是,在这我向大家推荐一种格式MessagePack, http://msgpack.org/ 这是它的官网,其实说白了就是通过第三方根据一定的格式来压缩数据,然后到server再按照它的那种格式解压缩。其实我个人感觉挺简单的(官网上的例子已经很清楚了),但是,在使用的时候会遇到一些想不到的问题。
首先,我还是简单的给大家介绍一下怎么使用吧!
开始前的准备,需要导入MessagePack的类库,但是仅仅导入msgpack-*.jar是不够的,你还需要导入javassist-*.jar文件,因为msgpack会用到后者的类库。前期的工作准备好后,就可以开始code了,下面是我写的一个简单的例子,大家可以先看一下。
1 package org.tech.msgpack;
2
3 import java.io.IOException;
4 import org.msgpack.MessagePack;
5 import org.msgpack.annotation.Message;
6
7 @Message
8 public class Student{
9 public int sAge = 0 ;
10
11 public String sName;
12
13 public boolean sHasPhone;
14
15 public static void main(String[] args) throws IOException {
16 Student stu = new Student();
17 stu.sAge=13 ;
18 stu.sName="programer" ;
19 stu.sHasPhone= true ;
20
21 MessagePack pack = new MessagePack();
22
23 // 序列化
24 byte [] bytes = pack.write(stu);
25
26 // 反序列化
27 Student s = pack.read(bytes, Student. class );
28 System.out.println("Name: "+s.sName+"\n"+"Age: "+s.sAge+"\n"+"HasPhone: "+ s.sHasPhone);
29 }
30 }
上面的代码是一种正常的模式,但是,有时会发生这样的情况,就是你有一部分产品已经发布出去了,但是呢?根据产品的发展,需求发生了很大的变化,需要在原来的Entity上增加一个字段,还要兼容之前发布的产品,这时,你该怎么办呢?看完下面那段代码,你大概就明白了。
1 package org.tech.msgpack;
2
3 import java.io.IOException;
4 import org.msgpack.MessagePack;
5 import org.msgpack.annotation.Message;
6 import org.msgpack.annotation.Optional;
7
8 @Message
9 public class ServerStudent {
10 public int sAge = 0 ;
11
12 public String sName;
13
14 public boolean sHasPhone;
15
16 /**
17 * 在Server端相应的Entity里添加需要的属性, 但是为了兼容之前的数据,必须加上注解@Optional
18 * Optional的作用是是否有该字段都不会影响MessagePack的正常解压
19 */
20 @Optional
21 public double sHeight;
22
23 /**
24 * 该类里并没有sHeight字段,可以把它看做已经发出去的产品
25 */
26 @Message
27 static class ClientStudent {
28
29 public int sAge = 0 ;
30
31 public String sName;
32
33 public boolean sHasPhone;
34 }
35
36 /**
37 * 与目前Server端数据字段相一致的Entity
38 */
39 @Message
40 static class NewClientStudent {
41 public int sAge = 0 ;
42
43 public String sName;
44
45 public boolean sHasPhone;
46
47 public double sHeight;
48 }
49
50 public static void main(String[] args) throws IOException {
51 ClientStudent stu = new ClientStudent();
52 stu.sAge = 13 ;
53 stu.sName = "programer" ;
54 stu.sHasPhone = true ;
55
56 NewClientStudent ns = new NewClientStudent();
57 ns.sAge = 10 ;
58 ns.sName = "coder" ;
59 ns.sHasPhone = false ;
60 ns.sHeight = 180 ;
61
62 MessagePack pack = new MessagePack();
63
64 // 序列化
65 byte [] bytes = pack.write(stu);
66 byte [] nBytes = pack.write(ns);
67
68 // 反序列化
69 ServerStudent s = pack.read(bytes, ServerStudent. class );
70 ServerStudent ss = pack.read(nBytes, ServerStudent. class );
71
72 System.out.println("之前发布出去的产品: \n" + "Name: " + s.sName + "\n"
73 + "Age: " + s.sAge + "\n" + "HasPhone: " + s.sHasPhone+"\n\n" );
74 System.out.println("目前的产品: \n" + "Name: " + ss.sName + "\n" + "Age: "
75 + ss.sAge + "\n" + "HasPhone: " + ss.sHasPhone + "\n"
76 + "Height: " + ss.sHeight);
77 }
78
79 }
只要在Server端加一个@Optional注解就OK了。这样虽然可以解决问题,但是,我们在加这个注解的时候需要格外的小心,尤其是加多个@Optional时,最好分开加,因为有时MessagePack也并不知道你少了那个数据。还有就是不要把@Optional字段打包到集合的前面。好了,目前就写这些吧!我写的有什么问题,或者大家有什么疑问,请尽管评论。
分类: MessagePack
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息