序列化概念
在java中,序列化指的是二进制流与对象之间的相互转化.
现主流的序列化框架以及他的优缺点
框架名称 | 性能排序 | 优点 | 缺点 | 是否推荐 |
---|---|---|---|---|
Protocal Buffers | 1 | 序列化快;开源 | 代码侵入性性强,需要相关的配置文件,无法直接使用Java等面向对象编程语言中的对象 | 否 |
Json/fastJson/JackSon | 2 | 序列化快,小巧,传输数据格式使用范围广,开源夸平台,夸语言 | 对泛型的支持不是很好 | 极力推荐 |
Hessian | 4 | 夸平台,夸语言,序列化的使用流程与java内置序列化类似,容易上手 | 性能略低 | 推荐 |
Java内置序列化 | 5 | 使用简单 | 由于是该语言的特殊序列化方式,其他语言没有办法进行解析,夸平台不支持,且性能较低 | 不支持 |
Xstream | 3 | 把对象转化成xml最好用的专业工具 | 使用不是很广泛,因为现在大多数的数据传输都通过json居多 | xml数据传输序列化则强烈推荐 |
看代码,看看各个框架在代码中的具体实现
Protocal Buffers
由于使用比较复杂,且能够直接使用Java中的对象,在本文就不做详细的介绍,想要了解的可以参考下如下网址:http://www.jianshu.com/p/b1f18240f0c7
FastJson,本文只是简单的做一个例子展示,具体的内容还需要参考官方文档
- 对象与Json互相转换
public static void main(){ Person person = new Person(); person.setAge(18); person.setName("ydw"); person.setId(1L); String ydwStr = JSON.toJSONString(person); System.out.println(ydwStr); Person ydwObj = JSON.parseObject(ydwStr, Person.class); System.out.println(ydwObj); }
- 对象与Json互相转换
Hessian 对象的序列化简单实用
public static void main(String[] args) throws IOException {
Person person = new Person();
person.setAge(18);
person.setName("ydw");
person.setId(1L);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
HessianOutput hessianOutput = new HessianOutput(byteArrayOutputStream);
//序列化
hessianOutput.writeObject(person);
byte[] bytes = byteArrayOutputStream.toByteArray();
//反序列化
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
HessianInput hessianInput = new HessianInput(byteArrayInputStream);
Person ydw = (Person) hessianInput.readObject();
System.out.println(ydw);
}
- java默认的序列化框架的简单使用
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person = new Person();
person.setAge(18);
person.setName("ydw");
person.setId(1L);
//自定义字节输出流
ByteArrayOutputStream os = new ByteArrayOutputStream();
//自定义一个对象输出流
ObjectOutputStream out = new ObjectOutputStream(os);
//把对象写入输出流,进行序列化
out.writeObject(person);
byte[] bytes = os.toByteArray();
//自己数组输入流
ByteArrayInputStream is = new ByteArrayInputStream(bytes);
//执行反序列化,从字节流中获取对象
ObjectInputStream inputStream = new ObjectInputStream(is);
Person ydw = (Person) inputStream.readObject();
System.out.println(ydw);
}
- xstream 对象与XML格式的互相转换
public static void main(String[] args) {
Person person = new Person();
person.setAge(18);
person.setName("ydw");
person.setId(1L);
XStream xStream = new XStream(new DomDriver());
xStream.alias("person",Person.class);
String xml = xStream.toXML(person);
System.out.println(xml);
Person fromXML = (Person) xStream.fromXML(xml);
System.out.println(fromXML);
}
以上框架的使用都是比较简单的,框架的使用远不只有这些,例如Json序列化的时候有时候还需要排除一些属性,在本文就不在详细的讲述,大家可以在网络上找到很多的资料进行学习.
数据的传输解决了 ,在RPC框架里面,我们还需要考虑协议的问题,在目前可以分为下面两类
- 基于TCP的RPC框架
- 基于HTTP的RPC框架
后面将会详细的介绍:基于TCP协议的RPC框架 ; 基于HTTP协议的RPC框架
ps:本篇所有的代码地址:https://git.oschina.net/ydwydw/encode_decode