1.概念

序列化Serialization,对象按照一定规则生成一连串字符的过程(序列化不仅仅是序列化成二进制,也可以是任何可读的字符串比如序列化成json字符串也属于序列化)

反序列化Deserialization,将一连串字符转重装成一个内存对象的过程

2.什么时候用到序列化

当想要将内存中的一个对象保存到硬盘或者数据库中的时候(持久化)

当你需要在跨平台下进行对象数据传输的时候,webservcie SOAP

在java平台上的,RPC 远程协议调用(rmi,dubbo)

消息中间件传输,比如rabbitMQ ActiveMQ  Tlq等

3.如何实现序列化

将需要序列化的类,实现序列化接口Serializable,通过ObjectOutputStream.writeObject序列化,通过ObjectInputStream.read反序列化

将需要序列化的类,实现序列化扩展接口Externalizable,这个接口需要实现其方法writeExternal和readExternal实现自定义规则。如果不实现(空实现),也任何属性都不会序列化

4.序列化注意点

transient 修饰的属性不会被序列

static 修饰的属性也不会被序列化(注意:在不同的jvm中才能测试出效因为同一个jvm中静态变量共享)

可以利用序列化,反序列实现对象的深克隆

单例对象并且是可序列化的,为了保证单例特征,使用覆写readResolve方法达到单例

5.重写序列化规则

5.1对于实现Serializable接口

结果:序列化了name和age属性

在要序列化的对象中,覆写readObject和writeObject方法可以自定义规则。注意:方法必须是私有的才起作用

java除了序列服务器还有什么能生成序列的方法_如何实现java序列化6

5.1对于实现Externalizable接口

结果是:只序列化了age顺序

java除了序列服务器还有什么能生成序列的方法_序列化_02

5.3 单例的可序列化的对象,如何保证即便反序列也保证单例

java除了序列服务器还有什么能生成序列的方法_json_03

6.网络环境中序列化场景

rmi:仅限于java环境;序列化效率低

webservice soap:跨语言跨平台的;序列化效率也低;基于xml的,可读性差;

json:跨语言跨平台;可读性强;序列化有提高

7.各种序列化方式排行榜:

java除了序列服务器还有什么能生成序列的方法_序列化_04

java除了序列服务器还有什么能生成序列的方法_json_05

messagepack比json速度快10倍

java除了序列服务器还有什么能生成序列的方法_json_06

8.messagepack序列化的使用(google提供)

引入相关jar包:javassist-3.20.0-GA.jar,msgpack-0.6.12.jar
使用方法:
1.序列化的对象添加@Message注解或者MessagePack.register(Person.class)注册类型(此时就不需要注解了更加实用)
2.必须要有无参的构造方法
3.MessagePack.write序列化化,MessagePack.read反序列化
@Message
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = 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;
}
public static void main(String[] args) throws IOException {
Person p = new Person("张三", 25);
MessagePack pack = new MessagePack();
byte[] b = pack.write(p);
MessagePack pack1 = new MessagePack();
Person p1= pack1.read(b,Person.class);
System.out.println(p1);//结果Person [name=张三, age=25]
System.out.println(p1==p);//结果false
}
}
9.fastjson的使用(阿里巴巴提供)
使用方法:
1.导入jar包fastjson-1.2.24.jar
2.使用JSON.toJSONString序列化成字符串,使用JSON.parseObject反序列化成对象
public static void main(String[] args) throws IOException {
Person p = new Person("张三", 25);
String str = JSON.toJSONString(p);
System.out.println(str);//{"age":25,"name":"张三"}
System.out.println(JSON.parseObject(str, Person.class));//Person [name=张三, age=25]
}
10.总结
网络传输要想提高效率:1.传输数据的大小 2.序列化反序列的时间消耗
大部分情况下,不要使用内置的序列化规则,因为效率太低。
推荐使用messagepack或者fastjson这两个开源的序列化框架,这样可以大大提高性能。并且序列化的对象可以不实现任何的接口.
messagepack:以二进制数组存储
fastjson:以字符串存储