java序列化和反序列化

硅谷探秘者 3467 0 0

概念:

Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;

序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。

反序列化:客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。


类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。


序列化id

虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID)


例:

package serializable;
import java.io.Serializable;
public class Person implements Serializable{
	/**
	 * 序列化id
	 */
	private static final long serialVersionUID = -6172176307319540879L;
	private String name;
	private Integer age;
	private String address;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
	}
}


测试:

package serializable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
public class SerializableTest {
	/**
	 * 对象序列化
	 */
	@Test
	public void  test1(){
		Person p = new Person();
        p.setName("jiajia");
        p.setAge(23);
        p.setAddress("河南");
        System.out.println(p);
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("E:\\test\\persion.out"));
            oos.writeObject(p);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        	try {
				oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
        }
	}
	
	/**
	 * 对象反序列化
	 */
	@Test
	public void  test2(){
		File file = new File("E:\\test\\persion.out");
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream(file));
            Person p = (Person) ois.readObject();
            System.out.println(p);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
            	ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
	}
}



猜你喜欢
java基础 2626 java网络(socket)中传输对象Person类,注意(两个项目中的Person类字节码要相同)packagesocket;importjava.io.Serializable
java序列化储存 2754 请参考:http://www.jiajiajia.club/blog/artical/yjw520/161源码下载地址:http://photo.jiajiajia.club
official 1253 没做处理的时候返回类似:"updateTime":"2021-05-06T10:57:27"这种形况添加配置:importcom.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; importcom.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSeriali
数据结构与算法 4311 递归实现合并两递增链表-合并后保持递增java描述数据结构:单链表算法:递归链表节点packageclub.test;/****链表节点*@authorjiajia
ofc 全排
official 611 leetcode第46题(中等)原链接https://leetcode-cn.com/problems/permutations/问题描述给定一个没有重复数字的,返回其所有可能的全排。示例输入
official 663 个整数,从数字1开始,中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串:countAndSay(1)="1"countAndSay(n)是对countAndSay(n
java虚拟机(jvm) 4093 Java对象的创建Java是一门面向对象的编程语言,在Java运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(例如克隆、)通常仅仅是一个new关键字而已,而在虚拟机中,对象
数据结构与算法 3591 外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排,整个排过程可以递归进行,以此达到整个数据变成有java实现:packagesort.fast;/***快速排*@aut
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2 2022年10月  2 2022年12月  5 2023年01月  3 2023年02月  1 2023年03月  4 2023年04月  2 2023年06月  3 2023年07月  4 2023年08月  1 2023年10月  1 2024年02月  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。