添加完整的代码

This commit is contained in:
YuCheng Hu 2019-08-07 00:46:36 -04:00
parent b84cd2d94b
commit 1543c67894
1 changed files with 102 additions and 0 deletions

View File

@ -454,3 +454,105 @@ public class MessagePack6Template {
}
----
=== 不使用注解annotations来序列化
如果你不能添加 @Message 到你的定义对象中但是你还是希望进行序列化。你可以使用 register 方法来在类中启用序列化对象。
如下的代码所示:
[source,java]
----
MessagePack msgpack = new MessagePack();
msgpack.register(MyMessage2.class);
----
例如如果 MyMessage2 类被包含到了外部的库中了。你没有办法比较容易的编辑源代码,添加 '_@Message_' 到源代码中。
register 方法能够允许为 MyMessage2 自动创建一个 serializer 和 deserializer 对。
你可以在执行方面后序列化对象 MyMessage2。
=== 可选字段
你可添加一个新的字段来保持可用性。在新字段中使用 '_@Optional_' 注解。
[source,java]
----
@Message
public static class MyMessage {
public String name;
public double version;
// new field
@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 中查看。
[source,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);
}
}
}
----