Java学习笔记42(序列化流)
对象中的数据,以流的形式,写入到文件中保存
过程称为写出对象,对象的序列化
ObjectOutputStream将对象写到文件中,实现序列化
在文件中,以流的形式,将对象读取出来,
读取对象,对象的反序列化
ObjectInputStream将文件对象读取出来,实现反序列化
示例:
简单写一个类:
package demo;
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int 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 + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
}
}
测试:
package demo; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class ObjectStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
function1();// 写入
function2();// 读取
} public static void function1() throws IOException {
FileOutputStream fos1 = new FileOutputStream("d:\\person.txt");
ObjectOutputStream oos1 = new ObjectOutputStream(fos1);
Person p1 = new Person("zhangsan", 18);
oos1.writeObject(p1);
oos1.close();
} public static void function2() throws IOException, ClassNotFoundException {
FileInputStream fis1 = new FileInputStream("d:\\person.txt");
ObjectInputStream ois1 = new ObjectInputStream(fis1);
Object object = ois1.readObject();
System.out.println(object);
ois1.close();
}
}
注意事项:
1.静态不能序列化,如果将Person类的age加上static,然后序列化操作,发现无论怎样,总有age=0
原因:对象序列化,而静态不属于对象,属于类,对象不包含静态,所以静态不能序列化,age=0的原因是默认为0
transient关键字:阻止成员变量序列化
有时候不希望成员变量序列化,但又不能将它定义为静态,这时候加上transient关键字即可
再解释下上边的person类是serializable接口的实现类:
这个接口中没有方法,称为标记性接口,起到标记作用,如果person类被标记才可以被序列化
序列号冲突问题:
原理通俗解释:
定义了一个person类,定义了两个私有成员变量,编译生成新文件person.class文件
编译器根据类的定义,会给class文件计算出一个序列号,这时候将class文件写入某个文件
读取的时候会对比序列号,序列号相同则反序列成功
如果突然修改person类的源码,这时候新编译后的class文件和之前的序列号不同,
然而文件中保存的是之前的序列号,这时候对比序列号,不一致,所以会抛出异常
解决序列号冲突问题的办法:
在自定义类中自定义序列号:
加入这一行,前部分不可改,后边的数字可以随意改
//固定写法
private static final long serialVersionUID = 42L;
Java学习笔记42(序列化流)的更多相关文章
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
- 【java学习笔记】序列化、反序列化
序列化 是将对象的完整信息保存起来的过程(持久化). 序列化流:ObjectOutputStream 反序列化 是将对象进行还原的过程(反持久化). 反序列化流:Ob ...
- 6.5(java学习笔记)其他流(字节数组流,数据流,对象流,打印流)
一.字节数组流 之前使用输入输出流的操作的对象是文件,而这里字节数组流操作的对象是内存,内存可以看做是一个字节数组. 使用字节数组流读写就可以看做是从内存A到内存B的读写,对象时内存即字节数组. 1. ...
- Java学习笔记-10.io流
1.输入流,只能从中读取数据,而不能向其写出数据.输出流,只能想起写入字节数据,而不能从中读取. 2.InputStream的类型有: ByteArrayInputStream 包含一个内存缓冲区,字 ...
- 6.3(java学习笔记)缓冲流
一.缓冲流 使用缓冲流后的输入输出流会先存储到缓冲区,等缓冲区满后一次性将缓冲区中的数据写入或取出. 避免程序频繁的和文件直接操作,这样操作有利于提高读写效率. 缓冲流是构建在输入输出流之上的,可以理 ...
- 6.4(java学习笔记)转换流
一.乱码问题 我们来看下列例子: public class ConStream { //当前平台默认采用GBK public static void main(String[] args){ Stri ...
- java学习笔记_序列化
如果父类没有实现Serializable接口,子类实现了Serializable接口,那么子类是可以序列化的. 但是如果想要反序列化,那么就需要父类支持默认构造函数. 因为在反序列化的过程中不会调用子 ...
- Java学习笔记——I/O流常用类之间的继承关系及构造方法
朝辞白帝彩云间,千里江陵一日还. 两岸猿声啼不住,轻舟已过万重山. ——早发白帝城 总结一下有哪些I/O流: 输入流方法主要是read()和close(),输出流方法主要是write().flush( ...
- Java学习笔记——I/O流
朝辞白帝彩云间,千里江陵一日还.两岸猿声啼不尽,轻舟已过万重山. --早发白帝城 我们老师写代码有个特点,就是简洁.每一句的意图都十分明确.所以他讲课的速度也比较快. 跑题了,说说I/O流: 1.字节 ...
随机推荐
- GDI+_入门教程【一】
GDI For VisualBasic6.0 [一]文件下载:GDI+ For VB6[一] 简单绘图实例演示百度网盘 1 '以下为作者[vIsiaswx]的教程 '(该教程发布的原地址已无法访问,此 ...
- Mad Lids游戏 华氏与摄氏温度转换
name1 = input('请输入一个名字:') name2 = input('请输入一个名字:') vehicle = input('请输入一种车子:') print('\n上近代史的{}刚下课, ...
- 加入EOS主网
[加入EOS主网] 根据之前的博文,可以直接在本地测试单节点网络.这里再给出一下.详情见[参考1]. alias cleos='docker exec -it eosio /opt/eosio/bin ...
- 解决find命令报错: paths must precede expression
eg: find . -name *.c -or -name *.cpp 需要将模糊搜索词用引号括起来: find . -name "*.c" -or -name "*. ...
- linux环境启动数据库
1.查看数据库监听的状态: 监听状态:lsnrctl status 出现如下列截图所示数据,说明切切换账户有问题:切换账户时要家:-: 如 su - oracle 第一步:打开Oracle监听$ ...
- effector - 必应词典
effector - 必应词典 美[ɪ'fektə(r)]英[ɪ'fektə(r)] n.效应物 网络效应器:效果器:受动器 变形复数:effectors:
- Springboot学习06-Spring AOP封装接口自定义校验
Springboot学习06-Spring AOP封装接口自定义校验 关键字 BindingResult.Spring AOP.自定义注解.自定义异常处理.ConstraintValidator 前言 ...
- PCIe 驱动流程(LTSSM)
本次的工作是完成刚流片的FPGA中PCIe IP核的bring up,也就是芯片的中PCIe的第一个使用者,将PCIe IP核正常使用起来,并配合公司的EDA团队,完成PCIe IP核到用户的呈现. ...
- 716. Max Stack实现一个最大stack
[抄题]: Design a max stack that supports push, pop, top, peekMax and popMax. push(x) -- Push element x ...
- odoo研究学习:刷新本地模块列表都干了什么事?
模块信息存储在ir.module.module 数据表中 平时在开发过程中经常会刷新本地模块列表,例如:新增了模块.更新了模块基础信息.更换了模块图标等等,在点击‘更新’按钮的时候odoo平台到底干了 ...