Java序列化(学习笔记)
序列化:Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
简单的说:序列化可将对象(一切皆为对象)存入文件,反序列化则将对象信息提取出来,就像把信息存到文件里,掉电后再取出信息回到上一次运行的状态。
引用菜鸟教程Java 序列化 | 菜鸟教程 (runoob.com)
要序列化的类(对象)必须实现 java.io.Serializable 接口。
该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。
如果你想知道一个 Java 标准类是否是可序列化的,请查看该类的文档。检验一个类的实例是否能序列化十分简单, 只需要查看该类有没有实现 java.io.Serializable接口。
比如将list(Arraylist类的顺序表)序列化到文件,并反序列化读取。
先创建person类实现接口
package com3_7_javatest;
import java.util.Objects;
public class person implements java.io. Serializable{
public String name;
public String id;
public person(String name ,String id){
this.name=name;
this.id=id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
person person = (person) o;
return Objects.equals(name, person.name) &&
Objects.equals(id, person.id);
}
@Override
public int hashCode() {
return Objects.hash(name, id);
}
}
序列化列表(列表中为若干个对象)存文件和反序列化
package com3_7_javatest;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class SeriallizeTest {
public static void main(String[] args) {
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("G:\\Serial.txt"));
List list=new ArrayList();
person a=new person("里斯","uioq");
person b=new person( "里斯2","popq");
person c=new person( "里斯3","qwer");
list.add(a);
list.add(b);
list.add(c);
oos.writeObject(list);
oos.close();
}
catch (Exception e) {
System.out.println("异常");
}
try {
ObjectInputStream read = new ObjectInputStream(new FileInputStream("G:\\Serial.txt"));
Object obj = read.readObject();
List mylist=(List)obj;
Iterator iterator=mylist.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next().toString());
}
read.close();
}
catch (Exception e){
}
}
}
这种序列化在写各种所谓的增删改查系统中比文件操作更加简单(比如可以将一个对象顺序表存文件中,又能简单高效地直接读出来),若是用transient修饰的成员变量的值则不会被序列化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?