javaIO中的序列化和反序列化

1、什么是序列化?它是来解决什么问题的

1、我们创建的对象,一般情况下在内存中,程序关闭,或者因为没有地址指向而导致垃圾回收
2、这样,我们的对象就会丢失
3、那么我们就需要一种技术来把对象存在文件中,这样就不会丢失
4、因此,把对象存入文件,我们叫序列化技术,把文件中的对象取出来,我们叫反序列化技术。

2、如何实现序列化(例如:)

1、需要序列化的对象加一个标记接口Serializable

/**
* 1、需要序列化的对象加一个标记接口Serializable
*/
public class Book implements Serializable {
int age;
String name;
public Book(int age,String name) {
this.age = age;
this.name = name;
} public Book() { } @Override
public String toString() {
return "Book{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}

2、直接进行IO操作即可

public class SerializeUser {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化
serializable();
//反序列化
deserializable();
} /**
* 序列化技术
* @throws IOException 抛出IO异常给父亲
*/
public static void serializable() throws IOException {
Book book1 = new Book(12,"金苹果");
Book book2 = new Book(13,"银苹果");
List<Book> list = new ArrayList<>();
list.add(book1);
list.add(book2);
FileOutputStream fos = new FileOutputStream("list.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(list);
oos.close();
} /**
* 反序列化技术
* @throws IOException 抛出IO异常给父亲
* @throws ClassNotFoundException 抛出文件找不到异常给父亲
*/
public static void deserializable() throws IOException, ClassNotFoundException {
File file = new File("list.txt");
FileInputStream fis = new FileInputStream("list.txt");
if(!file.exists() || file.length() == 0) {
return;
}
ObjectInputStream ois = new ObjectInputStream(fis);
List<Book> list = (List<Book>) ois.readObject();
for(Book book: list) {
System.out.println(book);
}
} }

3、如何实现部分序列化

1、属性中添加添加修饰符transient的成员属性,这个成员属性不能被序列化,其他正常序列化
2、属性中添加static也是不能被序列化
3、在实现标记接口Serializable的类中重写writeObject,和ReadObject必须是private void类型(例如)
public class Book implements Serializable {
int age;
String name;
public Book(int age,String name) {
this.age = age;
this.name = name;
} public Book() { } /**
* 将需要序列化的对象写到 out.writeObject()方法中
*/
@Override
private void writeObject() throws IOException {
out.writeObject(age);
out.writeObject(name);
} /**
* 和序列化对应,并和序列化的对象一一对应
*/
@Override
private void writeObject() throws IOException {
int age = (int)in.writeObject();
String name =(String) in.writeObject();
} @Override
public String toString() {
return "Book{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}

4、实现接口Externalizable,实现方法writeExternal和方法readExternal

最新文章

  1. Zabbix Trapper items
  2. 工作中那些提高你效率的神器(第一篇)_Everything
  3. Entity Framework 中的Code First 中引入数据库函数
  4. BZOJ 4576: [Usaco2016 Open]262144
  5. 获取指定版本号svn
  6. 【Javascript】列表查询页面,简单地保存上一次查询的查询参数
  7. 被Play framework狠狠的play了一把
  8. docker 中搭建tomcat
  9. eclipse启动tomcat 访问http://localhost:8080 报404错误
  10. Palindromes&amp;nbsp;_easy&amp;nbsp;version
  11. java学习书籍推荐
  12. python爬虫第六天
  13. 启动期间的内存管理之初始化过程概述----Linux内存管理(九)
  14. sql创建备份表和复制数据到备份表
  15. VIM 正则表达式详解及与 perl 正则的区别
  16. 类之间关系理解:组合&gt;聚合&gt;关联&gt;依赖;实现,继承
  17. mysql面试常见题目2
  18. Project Euler:Problem 86 Cuboid route
  19. go cobra
  20. ListView中pointToPosition()方法使用具体演示样例

热门文章

  1. TypeScript 面试题汇总(2020 版)
  2. Stack Overflow &amp; Segment Fault
  3. redux &amp; connect
  4. 小程序 &amp; taro 踩坑指南
  5. vue技术栈
  6. 「NGK每日快讯」2021.1.8日NGK第66期官方快讯!
  7. 「NGK每日快讯」12.17日NGK第44期官方快讯!
  8. yaml配置和ini配置的数据源配置和数据获取
  9. 数据库范式(1NF/2NF/3NF)
  10. 可以设置过期时间的Java缓存Map