Java 内置的序列化方式

网络数据传输的是一个二进制的字节数组。把对象序列化为二进制字节数组和把二进制字节数组反序列化为对象的时间加起来,时间越少,性能越高。使用 JSON 和 XML 的居多!

先看看 String 类的源码

1
2
3
4
5
6
7
8
9
10
11
12
public final class String implements
java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value [];

/** Cache the hash code for the string */
private int hash; // Default to 0

/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
//....................
}

Java 的内置序列化方式

可以看出 String 实现了 Java 的内置序列化接口 Serializable,于是接下来利用 String 类演示一下 Java 的内置序列化是怎样做到的:

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
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Demo {
public static void main(String [] args)
throws IOException, ClassNotFoundException {

String str = new String("Hello");

// 定义一个字节数组输出流
ByteArrayOutputStream os = new ByteArrayOutputStream();

// 对象输出流
ObjectOutputStream out = new ObjectOutputStream(os);

// 将对象写入到字节数组输出,进行序列化
out.writeObject (str);
byte[] strByte = os.toByteArray ();

// 字节数组输入流
ByteArrayInputStream is = new ByteArrayInputStream(strByte);

// 执行反序列化,从流中读取对象
ObjectInputStream in = new ObjectInputStream(is);

String str2 = (String) in.readObject ();
System.out.println (str2);
}
}

mark

使用 Hessian 进行序列化

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
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.caucho.hessian.io.HessianInput;
import com.caucho.hessian.io.HessianOutput;

public class Demo {
public static void main(String [] args)
throws IOException {
String str = new String("Hello");

// 定义一个字节数组输出流
ByteArrayOutputStream os = new ByteArrayOutputStream();

//Hessian 的序列化输出
HessianOutput ho = new HessianOutput(os);

ho.writeObject (str);

byte[] strByte = os.toByteArray ();

ByteArrayInputStream is = new ByteArrayInputStream(strByte);

//Hessioan 的反序列化读取对象
HessianInput hi = new HessianInput(is);

String str2 = (String) hi.readObject ();
System.out.println (str2);
}
}

mark