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