Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。简单说, Java序列化就是把Java对象转换为字节序列的过程。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。建单说,Java反序列化是指把字节序列恢复为Java对象的过程。
整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。
Java进程间进行通信,将Java对象进行序列化为字节序列,传送给另一个进程,另一个进程收到信息后,再进行反序列化,即得到对象信息。
两个用途:
1)通过序列化实现远程通信,也就是在网络上传送对象的字节序列,用于网络传输对象。举例dubbo服务中信息传送。
2)实现数据对象的持久化,通过序列化可把数据永久地保存至硬盘(通常存放在文件里),用于持久化对象。
3.1、java原生序列化。
使用类 ObjectInputStream 和 ObjectOutputStream
package com.liuxd.serialize;
import java.io.*;
/**
* Created by Liuxd on 2018/8/31.
*/
public class SerializeDemo {
public static void serialize() {
UserInfo e = new UserInfo("Jack", "USA", 12, 16);
try {
FileOutputStream fileOut = new FileOutputStream("D:/userInfo.txt");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("将 UserInfo 对象序列化进 D:/userInfo.txt");
} catch (IOException i) {
i.printStackTrace();
}
}
public static void deserialize() {
UserInfo userinfo;
try {
FileInputStream fileIn = new FileInputStream("D:/userInfo.txt");
ObjectInputStream in = new ObjectInputStream(fileIn);
userinfo = (UserInfo) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("UserInfo class not found");
c.printStackTrace();
return;
}
System.out.println("反序列化 UserInfo...");
System.out.println("name: " + userinfo.name);
System.out.println("addr: " + userinfo.addr);
System.out.println("num: " + userinfo.num);
System.out.println("number: " + userinfo.number);
}
public static void main(String[] args) {
serialize();
deserialize();
}
}
class UserInfo implements java.io.Serializable
{
public String name;
public String addr;
public transient int num;
public int number;
public UserInfo() {
}
public UserInfo(String name, String addr, int num, int number) {
this.name = name;
this.addr = addr;
this.num = num;
this.number = number;
}
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", addr='" + addr + '\'' +
", num=" + num +
", number=" + number +
'}';
}
}
3.2、json序列化
1、ObjectMapper
package com.liuxd.serialize;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
/**
* Created by Liuxd on 2018/9/3.
*/
public class JsonSerialize {
public static void jsonObjectSerialize() throws IOException {
UserInfo userInfo = new UserInfo("Jack", "USA", 12, 16);
ObjectMapper mapper = new ObjectMapper();
byte[] writeValueAsBytes = mapper.writeValueAsBytes(userInfo);
String str = new String(writeValueAsBytes);
System.out.println(str);
UserInfo user = mapper.readValue(writeValueAsBytes, UserInfo.class);
System.out.println("反序列化为对象: UserInfo: " + user);
}
public static void main(String[] args) throws IOException {
jsonObjectSerialize();
}
}
2、google的Gson类
package com.liuxd.serialize;
import com.google.gson.Gson;
/**
* Created by Liuxd on 2018/9/3.
*/
public class GoogleJson {
public static void googleGson(){
Gson gson = new Gson();
UserInfo userInfo = new UserInfo("Jack", "USA", 12, 16);
String text = gson.toJson(userInfo);
byte[] bytes = text.getBytes();
System.out.println("序列化后:"+bytes);
//反序列化
UserInfo user = gson.fromJson(new String(bytes), UserInfo.class);
System.out.println("反序列化 UserInfo...");
System.out.println("name: " + user.name);
System.out.println("addr: " + user.addr);
System.out.println("num: " + user.num);
System.out.println("number: " + user.number);
}
public static void main(String[] args) {
googleGson();
}
}
3、xml序列化(略)