简介

Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。从而达到网络传输、本地存储的效果。

序列化Serializable

实现Serializable接口,会自动将非transient修饰的变量序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package org.serial;

import java.io.Serializable;

public class User implements Serializable {

private static final long serialVersionUID = -184170424740238078L;

private String name;
private String sex;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package org.serial;

import java.io.*;

public class SerializableUtil {

public static Object deserializable(byte[] bytes) {
try (ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
Object o = objectInputStream.readObject();
return o;
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}

public static byte[] serializable(Object obj) {
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);) {
objectOutputStream.writeObject(obj);
return byteArrayOutputStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

public static void main(String[] args) {
User user = new User();
user.setName("zhang");
user.setSex("man");

byte[] serializable = SerializableUtil.serializable(user);
User deserializable = (User)SerializableUtil.deserializable(serializable);
System.out.println(deserializable.toString());
}
}

Externalizable

实现Externalizable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package org.serial;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class Car implements Externalizable {
private String name;
private String color;

@Override
public void writeExternal(ObjectOutput objectOutput) throws IOException {
objectOutput.writeObject(name);
objectOutput.writeObject(color);
}

@Override
public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {
String name = (String) objectInput.readObject();
String color = (String) objectInput.readObject();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}
}

注意

Externalizable接口实现方式一定要有默认的无参构造函数

Externalizable不需要产生序列化ID而Serializable需要

相比较Serializable,Externalizable序列化、反序列更加快速,占用相比较小的内存