• 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
  • 相关阅读:
    .net core webapi发布到linux中
    封装EF,使用仓储模式所遇到的问题
    oracle取分组的前N条数据
    20141124
    搭建discuz论坛(2)
    安装apache mysql 论坛(一)
    L13 DNS
    L10 PUtty+SSH 访问vncviewer
    L12 samba服务器搭建
    L10 数据入站、转发、出站流程
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2531167.html
Copyright © 2020-2023  润新知