好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MessagePack

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://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于MessagePack的详细内容...

  阅读:46次