序列化: 将数据结构或对象转换成二进制字节流序列存到磁盘或者发送到网络节点的过程。
反序列化:将在序列化过程中所生成的二进制字节流字节序列转换成数据结构或者对象的过程,这样就可以从磁盘或者网络节点中读取系列化的对象。
Java提供了内置的序列化和反序列化机制,主要通过实现java.io.Serializable
接口来实现序列化,通过ObjectInputStream
类和ObjectOutputStream
类来实现反序列化。
这里有Employee类实现了 Serializable接口如下:
class Employee implements Serializable {
public String name;
public int age;
}
那么我就可以进行如下方操作
在磁盘上的序列化和反序列化
这里可以先给实现化Employee对象属性赋值,并将其存入磁盘文件,该文件可以是txt、ser或者其他类型的文件,然后可以用反序列化取出来,这里只展示关键的属性代码
FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileIn.close();
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
Java的序列化还有其他操作比如:
在网络节点上的序列化和反序列化
//服务器向客服端发送Massage类对象,读取客服端发来的User类对象
ServerSocket ss = new ServerSocket(9999);
Socket socket = ss.accept();
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois=new ObjectInputStream(socket.getInputStream());
//客服端发来user对象,User也为为实现Serializable接口自定义的类
User u= (User) ois.readObject();
oos.writeObject(message);
//Message为实现Serializable接口的自定义类
Message message=(Message) ois.readObject();
//链接到服务器发送User类对象,读取Message类对象
Socket socket = new Socket (InetAddress.getByName("127.0.0.1"),9999);
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
//发送user对象
oos.writeObject(user);
//读取从服务器的得到的Message对象 (合法服务返回MESSAGE_LOGIN_SUCCEED属性)
ObjectInputStream ois=new ObjectInputStream(socket.getInputStream());
Message ms=(Message)ois.readObject(); //出现异常
JSON字符串序列化成对象,对象序列化成JSON字符串
引入maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
json转换成对象
String jsonUser = "{name:'小明',userid:11}"; //json字符串
Student student = JSON.parseObject(jsonUser, User.class); //这里的User.class包含name和userid属性
对象转换成json
String s = JSON.toJSONString(user); //user为一个实例
String str2 = "{\"name\":\"Yolo\",\"Address\":\"Beijing\", \"data\":{\"id\": 123}}";
JSONObject jsonObject2 = JSON.parseObject(str2);
System.out.println(jsonObject2.getString("data"));
System.out.println(JSON.parseObject(jsonObject2.getString("data")).getString("id"));