如题
  • 所有关联的类需要继承Serializable 接口
  • 文件为空,直接反序列化为发生错误; 毕竟对象为null , 序列化到文件里不是空空的!
  • 以下笔记的原文连接: https://www.cnblogs.com/fnz0/p/5410856.html
  1. 如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口。 Serializable接口没有任何的方法,是一个标识接口而已。
  2. 对象的反序列化创建对象的时候并不会调用到构造方法的、(这点文中没有说到,想要验证的同学在构造方法后面加一句System.out.println("构造方法执行吗?");,实际上构造方法是不执行的,自然这句话也没有输出了)
  3. serialVersionUID 是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出的一个数字。
  4. 使用ObjectInputStream反序列化的时候,ObjeectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID

    进行对比,如果这两个id不一致,反序列则失败。
  5. 如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一类已经指定的serialVersionUID,然后

    在序列化与反序列化的时候,jvm都不会再自己算这个 class的serialVersionUID了。
  6. 如果一个对象某个数据不想被序列化到硬盘上,可以使用关键字transient修饰。
  7. 如果一个类维护了另外一个类的引用,则另外一个类也需要实现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(对象的序列化与反序列化)的更多相关文章

  1. (JAVA)从零开始之--对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)

    对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流:  Ob ...

  2. 对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)

    对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流:  Ob ...

  3. 输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)

    对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流:  Ob ...

  4. Day 18:SequenceInputStream、合并切割mp3、对象输入输出流对象

    SequenceInputStream用例题讲述用法 需求:1.把a.txt与b.txt 文件的内容合并 2.把a.txt与b.txt .c.txt文件的内容合并 import java.io.Fil ...

  5. serialVersionUID序列化版本号与ObjectOutputStream对象输入输出流

    1. 观察ObjectOutputStream 我们观察ObjectOutputStream就可以发现该类没有无参构造,只有有参构造,所以他是一个包装流 2. 具体使用: public static ...

  6. java 对象输入输出流

    对象的输入输出流的作用: 用于写入对象 的信息读取对象的信息. 对象的持久化. 比如:用户信息.              ObjectInputStream   : 对象输入流            ...

  7. (21)IO流之对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream

    当创建对象时,程序运行时它就会存在,但是程序停止时,对象也就消失了.但是如果希望对象在程序不运行的情况下仍能存在并保存其信息,将会非常有用,对象将被重建并且拥有与程序上次运行时拥有的信息相同.可以使用 ...

  8. Java——IO流 对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream

    对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流:  Ob ...

  9. java 对象序列化与反序列化

    Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化  Java序列化是指把Java对象转换为 ...

随机推荐

  1. Windows 10 多用户同时远程登录

    win服务器版默认是支持多用户登陆的,甚至可以在主机上用不同用户自己远程登陆自己,如window server 2016. Win10 正常情况下是不允许用户同时远程的,即一个用户远程进来会把另一个用 ...

  2. linux设置root密码&进入不了root

    刚装的linux无法使用root需要初始化密码 1.设置密码 sudo passwd root 点击回车,然后输入两次你想设置的密码,比如123456 2.切换用户 su root 再输入你刚才设置的 ...

  3. lvm的一些特殊命令

    pvscan --cache # 将lvm信息同步到其他节点 ......未完待续

  4. 013 ECMAScript基础应用

    1.ECMAScript概述 (1)前端的发展历程 <1>web 1.0时代 最初的网页以HTML为主,是纯静态的网页.网页是只读的,信息流只能从服务的到客户端单向流通.开发人员也只关心页 ...

  5. C++生成和解析XML文件

    1.xml 指可扩展标记语言(EXtensible Markup Language) 2.xml 是一种标记语言,类似html 3.xml 的设计宗旨是传输数据,而非显示数据 4.xml 标签没有被预 ...

  6. C语言的变参列表 va_list

    1. va_list的基本原理和用法 #include<stdio.h> #include<stdarg.h> void func(int i,char *ch,...){ / ...

  7. PLC采集与控制,实现MES工序管理与品质管控,记录产品的加工数据,工厂生产装配流水线的一次成功应用

    1.通过程序与PLC的采集与控制,实现MES工序管理,品质管控,历史数据追溯的目的 2.大概的流程图 3.有三个地方相关联来实现以上功能,首先是MES的工序管理,设置指定的产品有那些工序,上位机程序扫 ...

  8. bootstrap-wizard向导插件的使用

    引用文件 <link rel="stylesheet" href="bootstrap-wizard/bootstrap-wizard.css"> ...

  9. python_并行与并发、多线程

    问题一: 计算机是如何执行程序指令的? 问题二: 计算机如何实现并发的? 轮询调度实现并发执行 程序1-8轮询完成,才再CPU上运行 问题三: 真正的并行需要依赖什么? 并行需要的核心条件 多进程实现 ...

  10. [loj 6253] Yazid的新生舞会

    (很久之前刷的题现在看起来十分陌生a) 题意: 给你一个长度为n的序列A,定义一个区间$[l,r]$是“新生舞会的”当且仅当该区间的众数次数严格大于$\frac{r-l+1}{2}$,求有多少子区间是 ...