Serializable 接口(序列化)
Serializable 接口(序列化)
前言
查看API文档时,就会发现
Serializable接口是一个标记接口(没有成员方法和变量),那么他有什么用呢?
- 序列化:可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反序列化)
- 一个类要想序列化就必须继承java.io.Serializable接口,同时它的子类也可以序列化(不用再继承
Serializable接口)。
Serializable接口,不仅可以本机,也可以网络操作,它自动屏蔽了操作系统的差异,字节顺序等。- 序列化只能保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量,而且序列化保存的只是变量的值,对于变量的任何修饰符都不能保存。记住序列化是保存对象的状态。
用途
- 想把的内存中的对象状态保存到一个文件中或者数据库中时候。
- 想把对象通过网络进行传播的时候。
如何实现
- 原理:Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里(系列化),并且可以从其它地方把该Byte 流里的数据读出来(反序列化)。
- 通过ObjectOutputStream的writeObject()方法把这个类的对象写到一个地方(文件),再通过ObjectInputStream的readObject()方法把这个对象读出来。
- 先写一个实现序列化的类Person
class Person implements Serializable{
    //序列化的关键常量
	private static final long serialVersionUID = -3911255650485738676L;
	private String name;
	private int age;
	public Person() {
		super();
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	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;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
- 用ObjectOutputStream的writeObject()方法把这个类的对象写到一个地方,再通过ObjectInputStream的readObject()方法把这个对象读出来。
public static void main(String[] args) throws Exception {
		write();
		read();
	}
	public static void read() throws Exception {
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
		Object obj = ois.readObject();
		System.out.println(obj);
		ois.close();
	}
	public static void write() throws Exception {
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
		Object obj = new Person("老王", 40);
		oos.writeObject(obj);
		oos.close();
	}
}
异常
- java.io.NotSerializableException - 名称:没有序列化异常
- 原因:在将对象保存到文件系统的时候没有将对象实现序列化接口
- 解决:针对需要写入到文件系统的对象实现对应的序列化接口
 
- InvalidClassException - 名称:无效类异常
- 原因:文件中保存的流的序列化id和本地类文件的序列化id不匹配(serialVersionUID)
- 解决:保证id一致性
 
serialVersionUID
serialVersionUID的取值是Java运行时环境根据类的内部细节自动生成的。如果对类的源代码作了修改,再重新编译,新生成的类文件的serialVersionUID的取值有可能也会发生变化。- 类的
serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的serialVersionUID,也有可能相同。一般给serialVersionUID赋予明确的值。- 当通过网络传输,因
serialVersionUID不一致的时候就会报InvalidClassException
transient关键字
- 阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。
- 简单的说:当某些变量不想被序列化,同是又不适合使用static关键字声明,那么此时就需要用transient关键字来声明该变量。(不会再反序列化的时候被获取数据,只会取得初始值,如 int 型的是 0,对象型的是 null。)
class Person implements Serializable{
    //序列化的关键常量
	private static final long serialVersionUID = -3911255650485738676L;
	private String name;
    //反序列化时不会获取age值
	private transient int age;
	public Person() {
		super();
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	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;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
以上
@Fzxey
Serializable 接口(序列化)的更多相关文章
- 谈谈序列化—实体bean一定要实现Serializable接口?
		导读:最近在做项目的过程中,发现一个问题,就是我们最开始的时候,传递参数包括返回类型,都有map类型.但是由于map每次都要匹配key值,很麻烦.所以在之后就将参数传递和返回类型全都改成了实体bean ... 
- Java Serializable(序列化)的理解和总结、具体实现过程(转)
		原文地址:http://www.apkbus.com/forum.php?mod=viewthread&tid=13576&fromuid=3402 Java Serializable ... 
- 对Java Serializable(序列化)的理解和总结(一)
		导读:最近在做项目的过程中,发现一个问题,就是我们最开始的时候,传递参数包括返回类型,都有map类型.但是由于map每次都要匹配key值,很麻烦.所以在之后就将参数传递和返回类型全都改成了实体bean ... 
- Java 序列化Serializable接口
		1 什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2 什么情况下需要 ... 
- 序列化、反序列化(实体类或要序列化的对象类必须实现Serializable接口)
		package com.phone.shuyinghengxie; import java.io.Serializable; /* 一个类的对象要想序列化成功,必须满足两个条件: 该类必须实现 jav ... 
- Java Serializable接口(序列化)理解及自定义序列化
		1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ... 
- Java序列化接口Serializable接口的作用总结
		一.Java序列化接口Serializable的作用: 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字 ... 
- 【Java面试题】45 什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。
		我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象 ... 
- Java中实现序列化的两种方式 Serializable 接口和 Externalizable接口
		对象的序列化就是将对象写入输出流中. 反序列化就是从输入流中将对象读取出来. 用来实现序列化的类都在java.io包中,我们常用的类或接口有: ObjectOutputStream:提供序列化对象并把 ... 
- 编程进阶:Java小白的序列化Serializable接口
		在之前的学习过程中,我们知道了如何使用FileInputStream输入流和FileOutputStream输出流编写程序读写文件. 下面我们来学习一下如何使用序列化和反序列化读写文件. 一.序列化 ... 
随机推荐
- String 字符串拼接
			字符串拼接有两个方法 第一中 var sad = "happy" var variable = "you"+sad +"" variable ... 
- Maven - No plugin found for prefix 'tomcat7' in the current project
			问题发现: 在构建Maven项目的时候,出现了No plugin found for prefix 'tomcat7' in the current project的错误. 是需要在Maven的Pom ... 
- 【论文笔记系列】AutoML:A Survey of State-of-the-art (下)
			[论文笔记系列]AutoML:A Survey of State-of-the-art (上) 上一篇文章介绍了Data preparation,Feature Engineering,Model S ... 
- 主导SEO成败的关键是细节的布局,细数SEO三大布局思路
			有的人认为SEO操作就类似车间工作,有一个完整的流程,整套流程下来网站就会有一个好的排名.这样是不对的,优化的着重点是要有一个好的思维,技巧和策略,把这些着重点相结合的运用到SEO优化中,很大的机率会 ... 
- 卡常的编译命令(含O2优化)
			不解释,直接来 //包括O2,O3之类的编译命令 //直接copy and paste #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma ... 
- 201503-1  图像旋转 Java
			思路: 观察输入和输出可以发现,第三列输出为第一行,第二列输出为第二行,第一列输出为第三行.循环即可 import java.util.Scanner; //得分80,本题最高需要输入100W次,因为 ... 
- Mac系统下查看Android studio默认debug签名与正式签名的SHA1值
			https://blog.csdn.net/weixin_32364917/article/details/80095063 获取默认debug签名SHA1值方法,也可以直接打开系统的终端 输入: k ... 
- SYN洪泛(dos)攻击和DDOS攻击
			在TCP三次握手中,服务器为了响应一个收到的SYN,分配并初始化连接变量和缓存,然后服务器发送一个SYNACK进行响应,并等待来自客户的ACK报文段,如果客户不发送ACK来完成该三次握手,最终,服务器 ... 
- 后台用Hbase对表单数据实现增删改查遇到的问题
			1.无法解析jsp 原因:hbase中lib下jar包会与tomcat包冲突,需要删除与tomcat冲突的包 这是我删除的几个包 之后运行就没有问题了 2.对于Hbase修改的问题 在添加数据时,HB ... 
- vector内部实现2
			push_back 往动态数组的内部进行添加数据 pop_back 往动态数组的尾部进行删除数据 resize 讲元素的数量len改成num个数量 如果size()变大了,多出来的将用默认构造来创 ... 
