java--序列化和反序列化
一、序列化
java序列化的过程是把对象转换为字节序列的过程
序列化的两种用途:
1)把对象的字节序列永久保存大搜硬盘上,通常存放到一个文件中
2)在网络上传送对象的字节序列
jdk中的序列化API:
java.io.ObjectOutputStream :表示对象输出流,他的writeObject(Object obj)方法可对参数制定的ibj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream :表示对象输入流,他的readObject()方法从一个源输入流中读取字节序列,再把他们反序列化为一个对象,并将其返回。
只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而实现了Serializable接口的类可以采用默认的序列化方式。
二、对象序列化的步骤:
1、创建一个对象输出流,它可以包装一个其他类型的源输入流,如文件输入流(IO流 装饰者模式)
2、通过对象输出流的writeObject()方法写对象
对象反序列化额步骤:
1、新创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流
2、通过对象输入流的readObject()方法读取对象
代码示例:
Person.java
public class Person implements Serializable { private int age;
private String name;
private String sex; @Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public Person(int age, String name, String sex) {
this.age = age;
this.name = name;
this.sex = sex;
}
}
序列化和反序列化person对象 序列化后的Person.txt文件中乱码 因为序列化的过程是将对象变成二进制存储的
public static void SerializePerson() throws IOException {
Person person=new Person(15,"xiaoming","nan");
//ObjectOutputStream 对象输出流,将Person对象存储到Person.txt文件,完成对Person对象的序列化
ObjectOutputStream oo=new ObjectOutputStream(new FileOutputStream(new File("classpath:Person.txt")));
oo.writeObject(person);
System.out.println("serialize complete");
oo.close();
}
反序列化的过程:
public static void Deserialize() throws IOException, ClassNotFoundException {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("classpath:Person.txt"));
Person person = (Person) ois.readObject();
System.out.println(person.toString());
System.out.println("deserialize complete");
ois.close();
}
运行两个过程:
serialize complete
Person{age=15, name='xiaoming', sex='nan'}
deserialize complete
忽然想起了transient关键字:做了个小改动
为Person类添加一个transient修饰的ext字段 创建person对象时为ext赋值 进行序列化,并且反序列化
public class Person implements Serializable {
private int age;
private String name;
private String sex;
private transient String ext;
序列化的person.txt文件中没有ext 反序列化的person对象的ext为null
serialize complete
Person{age=15, name='xiaoming', sex='nan', ext='null'}
deserialize complete
三、serialVersionUUID的作用
serialVersionUUID:序列化版本号,凡是实现Serializable接口的类都有一个表示序列化版本表示的静态变量(没有自动生成 也没有警告)
将Person序列化后再为Person类添加一个属性,再进行反序列化 反序列化失败
最新文章
- HTML实体符号代码速查表
- 网络通信分享(一):数字签名,数字证书,https通信,数据加密
- 在mac上安装svn客户端
- 【多路复用】I/O多路复用
- JavaScript之获取和设置元素属性
- spring_boot打jar包及打包错误的解决方法
- fopen参数
- python学习笔记(十 三)、网络编程
- JDBCTM中Statement接口提供的execute、executeQuery和executeUpdate之间的区别
- DWR第二篇之逆向Ajax
- 关于QT Graphics View开启OpenGL渲染后复选框、微调框等无法正常显示的问题
- NPOI导出excel(2.0.6版本)
- zabbix疑难之时区问题
- URL加载jar
- C#中属性和字段的区别
- SpringBoot 跨域 Access-Control-Allow-Origin 问题
- session过期情况下ajax请求不会触发重新登录的问题
- js中将文件的base64转换成file并上传到服务器
- android 启动流程
- 167. Add Two Numbers【easy】