1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/honeymoose-Framework-Docsify

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
index.md 16 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 02:58 5d5c666

MessagePack 文档

中文标题: MessagePack Java 0.6.X 快速开始指南

MessagePack 的相关文档, 本文是根据官方的内容和我们项目中的具体实践进行编辑的。

:warning: 0.6.x 版本的 MessagePack 已经过期被淘汰了。如果你现在开始使用 MessagePack, 请不要使用这个版本。

我们在这里保留 0.6.x 版本的内容主要用于参考用途。

最新的 MessagePack 版本请参考: https://github.com/msgpack/msgpack-java 中的项目源代码。

:information_source: MessagePack 中文文档请参考: http://docs.ossez.com/messagepack-docs/index.html

:information_source: MessagePack 测试和示例源代码: https://github.com/cwiki-us-demo/serialize-deserialize-demo-java

Этот документ содержит руководство по использованию msgpack-java. Сначала мы расскажем, как установить msgpack-java, а затем покажем, как использовать msgpack для сериализации и десериализации объектов.

Установка

Вы можете установить msgpack-Java двумя способами: из Maven или путём сборки jar-пакета.

Из Maven2

MessagePack для Java доступен в центральном репозитории Maven. Вы можете настроить файл pom.xml вашего проекта с помощью следующих параметров:

<dependency>
    <groupId>org.msgpack</groupId>
    <artifactId>msgpack</artifactId>
    <version>${msgpack.version}</version>
</dependency>

Замените ${msgpack.version} на текущую версию MessagePack. Доступные версии можно найти на сайте http://repo1.maven.org/maven2/org/msgpack/msgpack/.

Обратите внимание, что в версии 0.6.x последняя версия — 0.6.12.

Из git-репозитория

Вы также можете получить исходный код из репозитория.


$ git clone git@github.com:msgpack/msgpack-java.git
$ cd msgpack-java
$ mvn package

После компиляции вы получите файл msgpack.jar в каталоге msgpack-java/target.

Также вам понадобятся https://code.google.com/p/json-simple/ и https://github.com/jboss-javassist/javassist, чтобы использовать msgpack.jar в вашем проекте. В противном случае вы получите ошибку NoClassDefFoundError.

Использование

Вот пример кода для использования.

Использование класса, который можно упаковать (message-packable)

Используйте аннотацию '@Message' для сериализации публичных полей вашего класса.

Код можно загрузить с сайта https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Object.java и протестировать после компиляции.

package com.insight.demo.msgpack;

import org.junit.Test;
import org.msgpack.MessagePack;
import org.msgpack.annotation.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.UUID;

import static org.junit.Assert.assertEquals;

/**
 * MessagePack6Objects
 *
 * @author yhu
 */
public class MessagePack6Object {
    final Logger logger = LoggerFactory.getLogger(MessagePack6Object.class);

    /**
     * MessageData Message Object
     */
    @Message // Annotation
    public static class MessageData {
        // public fields are serialized.
        public String uuid;
        public String name;
        public double version;
    }


    /**
     * Test MessagePack6Objects
     */
    @Test
    public void testMessagePack6Objects() {
        logger.debug("MessagePack6Objects for Objects");

        String uuid = UUID.randomUUID().toString();

        // INIT OBJ
        MessageData src = new MessageData();
        src.uuid = uuid;
        src.name = "MessagePack6";
        src.version = 0.6;

        try {
            MessagePack msgPack = new MessagePack();

            // Serialization
            logger.debug("------ Serialization ------");
            byte[] bytes = msgPack.write(src);
            logger.debug("Bytes Array Length: [{}]", bytes.length);

            // Deserialization
            logger.debug("------ Deserialization ------");
            MessageData dst = msgPack.read(bytes, MessageData.class);
            logger.debug("Check Object for UUID: [{}]", dst.uuid);

            assertEquals(uuid, dst.uuid);

        } catch (Exception ex) {
            logger.error("MessagePack Serialization And Deserialization error", ex);
        }
    }
}

Если вы хотите сериализовать несколько объектов в определённом порядке, вы можете использовать Packer и Unpacker.

Это связано с тем, что 'MessagePack.write(Object)' и 'read(byte[])' фактически каждый раз создают объекты Packer и Unpacker.

Чтобы использовать Packer и Unpacker, вызовите 'createPacker(OutputStream)' и 'createUnpacker(InputStream)'.

Код можно посмотреть на сайте https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Objects.java. Сериализация и десериализация объектов различных типов

Классы Packer и Unpacker позволяют сериализовать и десериализовывать объекты различных типов, как показано в последующей программе. Этот класс позволяет сериализировать и десериализовывать различные типы переменных, а также основные типы данных и объекты-оболочки, такие как строки, массивы байтов и объекты ByteBuffer.

Как было указано выше, вы можете сериализовать и десериализовать свои собственные объекты, при условии что они используют аннотацию @Message.

Этот код можно найти на сайте https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Types.java.

package com.insight.demo.msgpack;

import org.junit.Test;
import org.msgpack.MessagePack;
import org.msgpack.packer.Packer;
import org.msgpack.unpacker.Unpacker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.math.BigInteger;
import java.nio.ByteBuffer;

/**
 * MessagePack6Types
 *
 * @author yhu
 */
public class MessagePack6Types {
    final Logger logger = LoggerFactory.getLogger(MessagePack6Types.class);


    /**
     * Test MessagePack6Types
     */
    @Test
    public void testMessagePack6Types() {
        logger.debug("testMessagePack6Types for Types");

        MessagePack msgpack = new MessagePack();
        try {

            //
            // Serialization
            //
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            Packer packer = msgpack.createPacker(out);

            // Serialize values of primitive types
            packer.write(true); // boolean value
            packer.write(10); // int value
            packer.write(10.5); // double value

            // Serialize objects of primitive wrapper types
            packer.write(Boolean.TRUE);
``` Метод `_Packer#write()_' **позволяет сериализовать данные различных типов**.

Класс `_Unpacker_' предназначен для десериализации двоичных данных в основные переменные и предоставляет метод десериализации. Например, если вы хотите десериализовать двоичные данные в переменную типа `_boolean_' (или `_int_'), вы можете использовать методы `_readBoolean_' (или '_readInt_') класса `_Unpacker_'.

`_Unpacker_' также предоставляет метод чтения для ссылочных переменных. Этот метод позволяет десериализовывать данные из двоичного формата в ссылочную переменную. При вызове метода необходимо указать тип переменной в качестве параметра.

Например, если вы хотите десериализовать двоичные данные в объект типа `_String_' (или массив типа `_byte[]_'), вам нужно определить это при вызове методов `_read(String.class)' (или '_read(byte[].class)_').

## Сериализация и десериализация объектов List и Map
Для сериализации нативных контейнерных объектов, таких как `_List_' и `_Map_' объекты, необходимо использовать класс `_Template_'.**

Объект `_Template_' является парой сериализатора и десериализатора. Например, чтобы сериализовать объект `_List_' с элементами типа `_Integer_' можно использовать следующий код для создания объекта шаблона:

```java
Template listTmpl = Templates.tList(Templates.TInteger);

Классы _tList_' и '_TInteger_' являются статическими методами поля Templates'.**

Пример использования объектов _List_' и Map':**

Этот код можно найти на странице https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Template.java.

package com.insight.demo.msgpack;

import org.junit.Test;
import org.msgpack.MessagePack;
import org.msgpack.packer.Packer;
import org.msgpack.template.Template;
import org.msgpack.unpacker.Unpacker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.msgpack.template.Templates.*;

/**
 * MessagePack6Template
 *
 * @author yhu
 */
public class MessagePack6Template {
    final Logger logger = LoggerFactory.getLogger(MessagePack6Template.class);


    /**
     * Test MessagePack6Template
     */
    @Test
    public void testMessagePack6Template() {
        logger.debug("MessagePack6Template for Template");

        MessagePack msgpack = new MessagePack();
        try {

            // Create templates for serializing/deserializing List and Map objects
            Template<List<String>> listTmpl = tList(TString);
            Template<Map<String, String>> mapTmpl = tMap(TString, TString);

            //

``` **Сериализация**

ByteArrayOutputStream out = new ByteArrayOutputStream();
Packer packer = msgpack.createPacker(out);

// Сериализуем объект List
List<String> list = new ArrayList<String>();
list.add("msgpack");
list.add("for");
list.add("java");
packer.write(list); // Объект List

// Сериализуем объект Map
Map<String, String> map = new HashMap<String, String>();
map.put("sadayuki", "furuhashi");
map.put("muga", "nishizawa");
packer.write(map); // Объект Map

**Десериализация**

byte[] bytes = out.toByteArray();
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
Unpacker unpacker = msgpack.createUnpacker(in);

// В объект List
List<String> dstList = unpacker.read(listTmpl);

// В объект Map
Map<String, String> dstMap = unpacker.read(mapTmpl);

} catch (Exception ex) {
    logger.error("MessagePack Serialization And Deserialization error", ex);
}
}

*### Без использования аннотаций для сериализации*

Если вы не можете добавить @Message к своим определяемым объектам, но всё равно хотите сериализовать их, вы можете использовать метод register для включения сериализации объектов в классе.

Например, если класс MyMessage2 содержится во внешней библиотеке, и у вас нет возможности легко редактировать исходный код и добавлять '_@Message_' в исходный код.

Метод register позволяет автоматически создать пару serializer и deserializer для MyMessage2. Вы можете сериализовать объекты MyMessage2 после выполнения.

*### Необязательные поля*

Вы можете добавить новое поле для сохранения совместимости. Используйте аннотацию '_@Optional_' в новом поле.

```java
@Message
public static class MyMessage {
  public String name;
  public double version;

  // Новое поле
  @Optional
  public int flag = 0;
}

Необязательное поле будет игнорироваться при попытке десериализации старых данных.

### Динамический тип

Мы знаем, что Java — это статически типизированный язык. С помощью 'Value' MessagePack может реализовать динамические характеристики. 'Value' имеет методы для проверки своего типа ('isIntegerType()', 'isArrayType()' и т.д.) и преобразования в свой тип ('asStringValue()', 'convert(Template)').

Этот код можно посмотреть на https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6DynamicTyping.java.

package com.insight.demo.msgpack;

import org.junit.Test;
import org.msgpack.MessagePack;
import org.msgpack.type.Value;
import org.msgpack.unpacker.Converter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

import static org.msgpack.template.Templates.TString;
import static org.msgpack.template.Templates.tList;

/**
 * MessagePack6Objects
 *
 * @author yhu
 */
public class MessagePack6DynamicTyping {
  final Logger logger = LoggerFactory.getLogger(MessagePack6DynamicTyping.class);


  /**
   * Test MessagePack6Objects
   */
  @Test
  public void MessagePack6DynamicTyping() {
    logger.debug("MessagePack6Objects for Objects");

    // Create serialize objects.
    List<String> src = new ArrayList<String>();
    src.add("msgpack");
    src.add("kumofs");
    src.add("viver");

    MessagePack msgpack = new MessagePack();

    try {

      // Serialize
      byte[] raw = msgpack.write(src);

      // Deserialize directly using a template
      List<String> dst1 = msgpack.read(raw, tList(TString));

      // Or, Deserialze to Value then convert type.
      Value dynamic = msgpack.read(raw);
      List<String> dst2 = new Converter(dynamic).read(tList(TString));

    } catch (Exception ex) {
      logger.error("MessagePack Serialization And Deserialization error", ex);
    }
  }
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/honeymoose-Framework-Docsify.git
git@api.gitlife.ru:oschina-mirror/honeymoose-Framework-Docsify.git
oschina-mirror
honeymoose-Framework-Docsify
honeymoose-Framework-Docsify
main