zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    CS229 6.4 Neurons Networks Autoencoders and Sparsity
    CS229 6.3 Neurons Networks Gradient Checking
    【Leetcode】【Easy】Min Stack
    【Leetcode】【Easy】Merge Sorted Array
    【Leetcode】【Easy】ZigZag Conversion
    【Leetcode】【Easy】Valid Palindrome
    【Leetcode】【Easy】Reverse Integer
    【Leetcode】【Easy】Palindrome Number
    【Leetcode】【Easy】Length of Last Word
    【Leetcode】【Easy】Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2531167.html
Copyright © 2011-2022 走看看