对象输入输出流ObjectInputStream、ObjectOutputStream(对象的序列化与反序列化)
如题
- 所有关联的类需要继承Serializable 接口
- 文件为空,直接反序列化为发生错误; 毕竟对象为null , 序列化到文件里不是空空的!
- 以下笔记的原文连接: https://www.cnblogs.com/fnz0/p/5410856.html
- 如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口。 Serializable接口没有任何的方法,是一个标识接口而已。
- 对象的反序列化创建对象的时候并不会调用到构造方法的、(这点文中没有说到,想要验证的同学在构造方法后面加一句System.out.println("构造方法执行吗?");,实际上构造方法是不执行的,自然这句话也没有输出了)
- serialVersionUID 是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出的一个数字。
- 使用ObjectInputStream反序列化的时候,ObjeectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID
进行对比,如果这两个id不一致,反序列则失败。- 如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一类已经指定的serialVersionUID,然后
在序列化与反序列化的时候,jvm都不会再自己算这个 class的serialVersionUID了。- 如果一个对象某个数据不想被序列化到硬盘上,可以使用关键字transient修饰。
- 如果一个类维护了另外一个类的引用,则另外一个类也需要实现Serializable接口。
代码
/**
* 对象输出流
* @author Administrator
*
*/
// 必须实现Serializable接口
public class Person implements Serializable {
// private static final long serialVersionUID = 1L;
private String name;
private Dog dog;
private List<Book> books;
// 省略getter / setter / toString() ....
/**
* main测试类
* @param args
*/
public static void main(String[] args) {
//对象输出流,序列化到当前path目录
String path="src/com/szs/serialize/person-data.txt";
try {
Person person = new Person();
person.setDog(new Dog("阿发","12"));
List<Book> books = new ArrayList<Book>();
books.add(new Book("Java", 200, "清社"));
books.add(new Book("C#", 300, "机械"));
person.setBooks(books);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path));
out.writeObject(person);
//在从当前目录读取, 输出到控制台;
//对象输入流,反序列化到控制台
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
Person person2 = (Person) ois.readObject();
System.out.println(person2);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
两个Person里的属性里的对象
class Dog implements Serializable {
private String name;
private String age;
public Dog(String name,String age) {
this.name=name;
this.age=age;
}
// 省略getter / setter / toString() ....
}
class Book implements Serializable {
private String name;
private Integer price;
private String author;
public Book(String name, Integer price, String author) {
super();
this.name = name;
this.price = price;
this.author = author;
}
/// 省略getter / setter / toString() ....
}
测试结果
文件里 (乱码了)
sr com.szs.serialize.Person*e犵韽 L bookst Ljava/util/List;L dogt Lcom/szs/serialize/Dog;L namet Ljava/lang/String;xpsr java.util.ArrayListx佉櫱a?
I sizexp w sr com.szs.serialize.Book榾7?? L authorq ~ L nameq ~ L pricet Ljava/lang/Integer;xpt 娓呯ぞt Javasr java.lang.Integer鉅亣8 I
valuexr java.lang.Number啲?斷? xp 萻q ~ t 鏈烘t C#sq ~ ,xsr
com.szs.serialize.Dogn磻;y冴 L ageq ~ L nameq ~ xpt 12t 闃垮彂p
控制台
Person [name=null, dog=Dog [name=阿发, age=12],
books=[Book [name=Java, price=200, author=清社], Book [name=C#, price=300, author=机械]]]
对象输入输出流ObjectInputStream、ObjectOutputStream(对象的序列化与反序列化)的更多相关文章
- (JAVA)从零开始之--对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)
对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流: Ob ...
- 对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)
对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流: Ob ...
- 输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)
对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流: Ob ...
- Day 18:SequenceInputStream、合并切割mp3、对象输入输出流对象
SequenceInputStream用例题讲述用法 需求:1.把a.txt与b.txt 文件的内容合并 2.把a.txt与b.txt .c.txt文件的内容合并 import java.io.Fil ...
- serialVersionUID序列化版本号与ObjectOutputStream对象输入输出流
1. 观察ObjectOutputStream 我们观察ObjectOutputStream就可以发现该类没有无参构造,只有有参构造,所以他是一个包装流 2. 具体使用: public static ...
- java 对象输入输出流
对象的输入输出流的作用: 用于写入对象 的信息读取对象的信息. 对象的持久化. 比如:用户信息. ObjectInputStream : 对象输入流 ...
- (21)IO流之对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream
当创建对象时,程序运行时它就会存在,但是程序停止时,对象也就消失了.但是如果希望对象在程序不运行的情况下仍能存在并保存其信息,将会非常有用,对象将被重建并且拥有与程序上次运行时拥有的信息相同.可以使用 ...
- Java——IO流 对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream
对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流: Ob ...
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
随机推荐
- TELNET可以连通但无法创建数据库连接(Oracle)
问题描述: 近期客户方进行了网络调整,申请A服务器的1521端口开通后,telnet可以访问,但是SQLPLUS.PLSQL等工具一直无法创建相应连接,提示连接超时. 问题排查: 对开放端口的所有服务 ...
- C# .NET “公钥证书” (.cer .pem)转换为 RSACryptoServiceProvider 对象。导出“公钥”
“公钥证书” .cer 文件是直接可以用X509Certificate2 对象来读取的,但 .cer 文件 不便于存储. “公钥证书” .pem 文件内容如下: -----BEGIN CERTIFIC ...
- 关闭正在执行的事务 Kill
.模拟资源锁定 --开始事务BEGIN TRANSACTION--更新数据update Table_1 set FuncName=FuncName--等待1分钟WAITFOR DELAY '01:00 ...
- Git 克隆
工作中大家分工协作,共同开发维护一个项目,git仓库放在公共的服务器上,如github.Gitee等. 在这种情况使用git,需要先克隆仓库到本地. 克隆非常简单,使用命令git clone 将远程仓 ...
- 1.4 Linux下对lvm逻辑卷分区大小的调整(针对xfs和ext4不同文件系统)
当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷 ...
- 未安装发布所需的web发布扩展
解决方案:需要安装web deploy 下载网站:https://www.iis.net/downloads/microsoft/web-deploy 假如还是打不开的话,估计时打开方式错误了, 要用 ...
- .net 生成非托管代码
最近在一个老外的程序中看到一段代码,其中使用了System.Runtime.InteropServices.MarshalAs方法进行托管代码与非托管代码之间封装数据,感觉很新颖.特意记录下来,供大家 ...
- 对一次 redis 未授权写入攻击的分析以及学习
前段时间自己使用 redis 开发的时候,搞了一个 docker ,然后直接开放连接没有密码,其实一开始我就知道会被黑产扫到然后给我种马,但是把因为也是测试服务,其实也没怎么上心,于是就放任自由了,结 ...
- C# vb .net实现淡色效果滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的淡色效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- TCP三次握手四次挥手介绍
学过计算机网络的同学都知道TCP协议是计算机网络课程里面最复杂的协议之一,还没有通信就要搞个什么三次握手,断开还要什么四次分手,中间还要什么流量控制啦,拥塞控制,滑动窗口什么的,初学者看了就会头晕. ...