zoukankan      html  css  js  c++  java
  • 使用MessagePack来压缩传输数据

    MessagePack提供了很多中语言的实现方式。

    以C#语言为例:(代码来自MessagePack的网站)

    Simple Packer/Unpacker

    BoxingPacker Example
    using MsgPack;
     
    namespace Test {
      public class TestApp {
        public static void Main () {
          BoxingPacker packer = new BoxingPacker ();
          object[] obj = new object[] {
            new object[] {1, 2, 3, 4},
            new KeyValuePair<object, object>[] {
              new KeyValuePair<object, object> (3, true),
              new KeyValuePair<object, object> (5, false)
            },
            new object[] {3.14f, Math.PI}
          };
          byte[] binary = packer.Pack (obj);
          object deserialized = packer.Unpack (binary);
        }
      }
    }

    Object Packer/Unpacker

    CompiledPacker can serialize public class only.

    CompiledPacker
    using MsgPack;
     
    namespace Test {
      public class TestApp {
        public static void Main () {
          DataClass data = new DataClass {IntField = 1, StringField = "Hello World",
                                          ArrayField = new int[]{1, 2, 3}, Private = "Private Field"};
          CompiledPacker packer = new CompiledPacker (false); // serialize public field only (fastest method)
          byte[] binary = packer.Pack<DataClass> (data);
          DataClass data2 = packer.Unpack<DataClass> (binary);
     
          packer = new CompiledPacker (true); // serialize all fields
          binary = packer.Pack<DataClass> (data);
          DataClass data3 = packer.Unpack<DataClass> (binary);
     
          Console.WriteLine ("data :");
          Console.WriteLine (data);
          Console.WriteLine ();
          Console.WriteLine ("data2:");
          Console.WriteLine (data2);
          Console.WriteLine ();
          Console.WriteLine ("data3:");
          Console.WriteLine (data3);
          Console.WriteLine ();
        }
     
        public class DataClass
        {
          public int IntField;
          public string StringField;
          public int[] ArrayField;
          string PrivateField;
     
          public string Private {
            get { return PrivateField; }
            set { PrivateField = value;}
          }
     
          public override string ToString ()
          {
            return string.Format ("IntField = {0}\r\nStrField = {1}\r\nAryField = {2} items\r\nPrivate  = {3}",
                                  IntField, StringField, ArrayField == null ? 0 : ArrayField.Length, PrivateField);
          }
        }
      }
    }

    Result
    data :
    IntField = 1
    StrField = Hello World
    AryField = 3 items
    Private  = Private Field
     
    data2:
    IntField = 1
    StrField = Hello World
    AryField = 3 items
    Private  =
     
    data3:
    IntField = 1
    StrField = Hello World
    AryField = 3 items
    Private  = Private Field

    ObjectPacker (Reflection-based Packer, Slowly)

    ObjectPacker can serialize private class/field.

    ObjectPacker Example
     
     
    using MsgPack;
     
    namespace Test {
      public class TestApp {
        static void Main ()
        {      
          DataClass data = new DataClass {IntField = 1, StringField = "Hello World",
                                          ArrayField = new int[]{1, 2, 3}, Private = "Private Field"};
          ObjectPacker packer = new ObjectPacker ();
          byte[] binary = packer.Pack (data);
          DataClass data2 = packer.Unpack<DataClass> (binary);
          
          Console.WriteLine ("data :");
          Console.WriteLine (data);
          Console.WriteLine ();
          Console.WriteLine ("data2:");
          Console.WriteLine (data2);
        }
     
        public class DataClass
        {
          public int IntField;
          public string StringField;
          public int[] ArrayField;
          string PrivateField;
     
          public string Private {
            get { return PrivateField; }
            set { PrivateField = value;}
          }
     
          public override string ToString ()
          {
            return string.Format ("IntField = {0}\r\nStrField = {1}\r\nAryField = {2} items\r\nPrivate  = {3}",
                                  IntField, StringField, ArrayField == null ? 0 : ArrayField.Length, PrivateField);
          }
        }
      }
    }
    Result
    data :
    IntField = 1
    StrField = Hello World
    AryField = 3 items
    Private  = Private Field
     
    data2:
    IntField = 1
    StrField = Hello World
    AryField = 3 items
    Private  = Private Field

    MsgPackReader / Writer

    Represents a reader/writer that provides fast, non-cached, forward-only access to MessagePack stream.

    MsgPackReader / MsgPackWriter Example
     
     
    using MsgPack;
     
    namespace Test {
      public class TestApp {
        static void Main ()
        {
          Stream strm = new MemoryStream ();
          MsgPackWriter writer = new MsgPackWriter (strm);
          writer.Write (1);
          writer.WriteNil ();
          writer.Write (true);
          writer.WriteArrayHeader (3);
          writer.Write (1);
          writer.Write (2);
          writer.Write (3);
     
          strm.Seek (0, SeekOrigin.Begin);
          MsgPackReader reader = new MsgPackReader (strm);
          while (reader.Read ()) {
            Console.Write ("{0}: ", reader.Type);
            if (reader.IsSigned ())
              Console.WriteLine (reader.ValueSigned);
            else if (reader.Type == TypePrefixes.Nil)
              Console.WriteLine ("(nil)");
            else if (reader.IsBoolean ())
              Console.WriteLine (reader.ValueBoolean);
            else if (reader.IsArray ())
              Console.WriteLine ("len = {0}", reader.Length);
          }
        }
      }
    }
    Result
    PositiveFixNum: 1
    Nil: (nil)
    True: True
    FixArray: len = 3
    PositiveFixNum: 1
    PositiveFixNum: 2
    PositiveFixNum: 3
    Labels:
     
  • 相关阅读:
    线程之间通信 等待(wait)和通知(notify)
    python输出所有三位数的回文数
    python之1100之间的总和,奇数和,偶数和
    python之九九乘法表
    数据类型
    python之判断闰年
    python的下载与安装
    pycharm的下载与安装
    Windows Phone 7 学习流程攻略(二)
    Windows Phone 7 学习流程攻略(三)
  • 原文地址:https://www.cnblogs.com/peiandsky/p/2467766.html
Copyright © 2011-2022 走看看