学习Java序列化和反序列化总结
序列化和反序列化在开发的过程中会经常使用,任何语言的开发过程中都离不开这两个操作,因为在不同的应用或者进程之间通信时,需要相互之间发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。而想要实现进程间的对象传送那就需要序列化和发序列化。
概述
Java对象序列化就是一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
Java反序列化就是从字节流创建对象的相反的过程,也就是把对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
整个过程都是 Java 虚拟机(JVM)独立的,创建的字节流是与平台无关的,在一个平台上序列化的对象可以在不同的平台上反序列化。
序列化和反序列化作用
如果要在网络上传送,发送方就需要把Java对象转换为字节序列进行传输;接收方需要从字节序列中恢复Java对象才能方便使用。
实现方式
要想一个 Java 对象可以实现序列化与反序列化,必须让该类实现 java.io.Serializable 接口,它是一个标记接口,意味着它不包含任何方法或字段,仅用于标识可序列化的语义。
对象输出流: java.io.ObjectOutputStream 的 writeObject(Object obj) 方法可以对参数指定的 obj 对象进行序列化,把得到的字节序列写到一个目标输出流中。
对象输入流: java.io.ObjectInputStream 的 readObject() 方法可以对源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。
注意:如果不可序列化的对象进行序列化会得到一个 RuntimeException 异常:主线程中出现异常 java.io.NotSerializableException。
package com.utils;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializeTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 序列化
Student stu =new Student();
stu.setName("Java");
stu.setAge(18);
stu.setSex("男");
SerializeObj(stu);
// 反序列化
Student stu1 = DeserializeObj();
System.out.println("id :"+stu1.getId());
System.out.println("name :"+stu1.getName());
System.out.println("age :"+stu1.getAge());
System.out.println("sex :"+stu1.getSex());
}
public static void SerializeObj(Object obj) {
//TODO 序列化
ObjectOutputStream outputStream = null;
try {
// 创建输出流,并把对象序列化保存到文件中
outputStream=new ObjectOutputStream(new FileOutputStream("E:/test.txt"));
outputStream.writeObject(obj);
System.out.println("序列化成功");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static Student DeserializeObj() {
//TODO 反序列化
Student stu=null;
ObjectInputStream inputStream=null;
try {
// 创建输入流,获取文件中的字节流
inputStream=new ObjectInputStream(new FileInputStream("E:/test.txt"));
try {
stu=(Student)inputStream.readObject();
System.out.println("反序列化成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return stu;
}
}
class Student implements Serializable {
private int id;
private String name;
private int age;
private String sex;
public Student() {
this.id = this.id + 1;
}
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getId() {
return id;
}
}
Hutool实现JSON序列化和反序列化
JSONObject代表一个JSON中的键值对象,这个对象以大括号包围,每个键值对使用 , 隔开,键与值使用 : 隔开;键部分可以省略双引号,值为字符串时不能省略,为数字或布尔值时不加双引号。
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu =new Student();
stu.setName("Java");
stu.setAge(18);
stu.setSex("男");
// 把JSON对象转字符串
JSONObject json = JSONUtil.parseObj(stu, false);
System.out.println(json.toString());
String jsonStr = "{\"name\":\"value2\",\"age\":20,\"sex\":\"女\"}";
//方法一:使用 JSONUtil 工具类转换
JSONObject jsonObject1 = JSONUtil.parseObj(jsonStr);
System.out.println("jsonObject1:"+jsonObject1);
//方法二:new JSONObject 对象的方式转换
JSONObject jsonObject2 = new JSONObject(jsonStr);
System.out.println("jsonObject2:"+jsonObject2);
}
温馨提示
文章内容如果写的存在问题欢迎留言指出,让我们共同交流,共同探讨,共同进步~~~
文章如果对你有帮助,动动你的小手点个赞,鼓励一下,给我前行的动力。
- 点赞
- 收藏
- 关注作者
评论(0)