Java中本身技术序列化技术,即使用ObjectInputStream
和ObjectOutputStream
即可完成对象的序列化和反序列化,目的主要有如下:
当然,因为最近学习主要是学习Netty,所以这里更多是出于网络传输的目的,所以对于编解码的基本解释,可如下:
当然因为Java序列化技术本身的局限,如不能跨语言、序列化性能低、序列化码流大等问题,所以出现了很多编解码框架,如这里要说明的MessagePack。
直接给出下面的代码即可了解MessagePack的基本使用方法,不过这里需要说明的是,MessagePack将对象编码后,解码返回的对象是一个List集合,例如将一个pojo对象编码再解码后的结果就是原来pojo对象属性所组成的List列表。
package cn.xpleaf.msgpack;
import java.util.ArrayList;
import java.util.List;
import org.msgpack.MessagePack;
import org.msgpack.template.Templates;
import org.msgpack.type.Value;
import cn.xpleaf.pojo.User;
public class Demo {
public static void main(String[] args) throws Exception {
// 创建需要编码的对象
List<String> src = new ArrayList<>();
src.add("msgpack");
src.add("kumofs");
src.add("viver");
MessagePack msgpack = new MessagePack();
// 编码操作
byte[] raw = msgpack.write(src);
// 使用模板对象进行解码操作
List<String> dst1 = msgpack.read(raw, Templates.tList(Templates.TString));
System.out.println(dst1);
// pojo对象编解码
User user = new User();
user.setName("xpleaf");
user.setAge(10);
byte[] bytes = msgpack.write(user);
Object obj = msgpack.read(bytes);
System.out.println(obj); // 解码结果是一个列表["xpleaf",10]
}
}
package cn.xpleaf.pojo;
import org.msgpack.annotation.Message;
@Message
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
运行Demo.java,输出结果如下:
[msgpack, kumofs, viver]
["xpleaf",10]
原文:http://blog.51cto.com/xpleaf/2071681