MessagePack 文档
中文标题: MessagePack Java 0.6.X 快速开始指南
MessagePack 的相关文档, 本文是根据官方的内容和我们项目中的具体实践进行编辑的。
0.6.x 版本的 MessagePack 已经过期被淘汰了。如果你现在开始使用 MessagePack, 请不要使用这个版本。
我们在这里保留 0.6.x 版本的内容主要用于参考用途。
最新的 MessagePack 版本请参考: https://github.com/msgpack/msgpack-java 中的项目源代码。
MessagePack 中文文档请参考: http://docs.ossez.com/messagepack-docs/index.html
MessagePack 测试和示例源代码: https://github.com/cwiki-us-demo/serialize-deserialize-demo-java
Этот документ содержит руководство по использованию msgpack-java. Сначала мы расскажем, как установить msgpack-java, а затем покажем, как использовать msgpack для сериализации и десериализации объектов.
Вы можете установить msgpack-Java двумя способами: из Maven или путём сборки jar-пакета.
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 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' для сериализации публичных полей вашего класса.
Код можно загрузить с сайта 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 )