对象中的数据,以流的形式,写入到文件中保存

过程称为写出对象,对象的序列化

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(序列化流)的更多相关文章

  1. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  2. 【java学习笔记】序列化、反序列化

    序列化 是将对象的完整信息保存起来的过程(持久化).    序列化流:ObjectOutputStream 反序列化 是将对象进行还原的过程(反持久化).               反序列化流:Ob ...

  3. 6.5(java学习笔记)其他流(字节数组流,数据流,对象流,打印流)

    一.字节数组流 之前使用输入输出流的操作的对象是文件,而这里字节数组流操作的对象是内存,内存可以看做是一个字节数组. 使用字节数组流读写就可以看做是从内存A到内存B的读写,对象时内存即字节数组. 1. ...

  4. Java学习笔记-10.io流

    1.输入流,只能从中读取数据,而不能向其写出数据.输出流,只能想起写入字节数据,而不能从中读取. 2.InputStream的类型有: ByteArrayInputStream 包含一个内存缓冲区,字 ...

  5. 6.3(java学习笔记)缓冲流

    一.缓冲流 使用缓冲流后的输入输出流会先存储到缓冲区,等缓冲区满后一次性将缓冲区中的数据写入或取出. 避免程序频繁的和文件直接操作,这样操作有利于提高读写效率. 缓冲流是构建在输入输出流之上的,可以理 ...

  6. 6.4(java学习笔记)转换流

    一.乱码问题 我们来看下列例子: public class ConStream { //当前平台默认采用GBK public static void main(String[] args){ Stri ...

  7. java学习笔记_序列化

    如果父类没有实现Serializable接口,子类实现了Serializable接口,那么子类是可以序列化的. 但是如果想要反序列化,那么就需要父类支持默认构造函数. 因为在反序列化的过程中不会调用子 ...

  8. Java学习笔记——I/O流常用类之间的继承关系及构造方法

    朝辞白帝彩云间,千里江陵一日还. 两岸猿声啼不住,轻舟已过万重山. ——早发白帝城 总结一下有哪些I/O流: 输入流方法主要是read()和close(),输出流方法主要是write().flush( ...

  9. Java学习笔记——I/O流

    朝辞白帝彩云间,千里江陵一日还.两岸猿声啼不尽,轻舟已过万重山. --早发白帝城 我们老师写代码有个特点,就是简洁.每一句的意图都十分明确.所以他讲课的速度也比较快. 跑题了,说说I/O流: 1.字节 ...

随机推荐

  1. 【395】yield 和 yield from

    yield:生成器 yield from:将生成器 yield 的内容相当于逐一在 yield 一般 参考:Python 3: Using "yield from" in Gene ...

  2. python,opencv,imread,imwrite,存储,读取图像像素不一致,这种情况是label使用jpg格式

    最近在做图像分割,需要使用一些分割图片的label,但是发现存储的分割label感觉被平滑过了,即使使用 image = cv2.imread(info['path'],cv2.IMREAD_UNCH ...

  3. R语言-图的要素颜色

    1.设置图形要素的颜色 Plot函数中,使用col=参数来决定要素的颜色 如果不指定plot type,颜色加在散点上,如果指定了plot type,例如line,则颜色加在线上 其它函数,例如bar ...

  4. 【Unity】打包安卓APK常见问题

    问题:unity error invalid command android 原因:Android版本较新,Unity版本太旧(如4.X),Unity打包APK时调用Android工具使用的命令已被安 ...

  5. IPV4/IPV6双协议栈配置案例

    拓扑: XRV1配置: =================================================================== hostname XRV1! ipv6 ...

  6. cmd中sudo以后显示password不能输入密码

    文本界面还是图形界面下输入密码都不会有回显,这是为了安全考虑. 其实你不是不能输入密码只是你看不到而已,事实上你已经输入进去了,回车后就能看到效果了. 来源于:https://zhidao.baidu ...

  7. mybatis的基础Dao

    话不多说,直接贴代码吧,因为很多博客都需要用到这个基础dao,怕大家不好查询. 这个基类主要是使用了泛型,这样我就不必为每一个实体都写一个dao,大大节省了时间.其中sqlSessionTemplat ...

  8. Head First Servlets & JSP 学习笔记 第九章 —— 使用JSTL

    JSTL1.1 不是JSP2.0规范的一部分!你能访问Servlet和JSP API 不意味着你能访问JSTL! 使用JSTL之前,需要将两个文件("jstl.jar" 和 &qu ...

  9. 【Spring】浅谈spring为什么推荐使用构造器注入

    一.前言 ​ Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反转)和AOP,平时使用最多的就是其中的IOC,我们通过将组件交由S ...

  10. Android 获得本地IP地址、外网IP地址、本设备网络状态信息、本地Mac地址

    本地内网IP和外网IP的区别: 根据我的经验一台电脑需要两个ip才可以上网,一个是本地的内网ip 一个是外网的ip 本地的ip 一般是192.168.1.2这种样子  只要在不同的路由器上可以重复 外 ...