学习Java序列化和反序列化总结

举报
zekelove 发表于 2021/11/16 15:43:27 2021/11/16
【摘要】 Java对象序列化就是一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。Java反序列化就是从字节流创建对象的相反的过程,也就是把对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。使用Hutool实现JSON对象的序列化和反序列化方式。

序列化和反序列化在开发的过程中会经常使用,任何语言的开发过程中都离不开这两个操作,因为在不同的应用或者进程之间通信时,需要相互之间发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。而想要实现进程间的对象传送那就需要序列化和发序列化。

概述

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);
	}

温馨提示

文章内容如果写的存在问题欢迎留言指出,让我们共同交流,共同探讨,共同进步~~~

文章如果对你有帮助,动动你的小手点个赞,鼓励一下,给我前行的动力。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。