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类添加一个属性,再进行反序列化 反序列化失败
java--序列化和反序列化的更多相关文章
- Java序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- [转] Java序列化与反序列化
原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ...
- Java序列化与反序列化(Serializable)
Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...
- Java基础(五)-Java序列化与反序列化
.output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...
- JAVA序列化和反序列化XML
package com.lss.utils; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.Bu ...
- Java序列化与反序列化(实践)
Java序列化与反序列化(实践) 基本概念:序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 昨天在一本书上 ...
- java序列化与反序列化(转)
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节 ...
- (记录)Jedis存放对象和读取对象--Java序列化与反序列化
一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...
- Java序列化与反序列化三连问:是什么?为什么要?如何做?
Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...
随机推荐
- JS string 常用方法总结
var str = "abc123def666"; // charAt() 方法返回字符串中指定位置的字符. // 参数:index // console.log(str.char ...
- MySQL之字符集
看unicode编码区从1 - 126就属于传统utf8区,当然utf8mb4也兼容这个区,126行以下就是utf8mb4扩充区 1.utf8与utf8mb4(utf8 most bytes 4) M ...
- DAY29、元类
一.eval内置函数eval内置函数的使用场景: 1.执行字符串会得到相应的执行结果 2.一般用于类型转换,得到dict.list.tuple例: dic_str = ''{'a':1,'b':2}' ...
- 最长公共子序列(POJ1458)
给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致. Sample Input: abcfbc abfcabpr ...
- 基于H5的混合开发介绍(一)WebView
转自: https://www.cnblogs.com/sanchang/p/9261461.html 一 WebView到底是什么 1 WebView是一种控件,它基于webkit引擎,因此具 ...
- Linux基础整理
命令 说明 chsh 查看和修改当前登录的Shell export 查看和设置Shell环境变量 read 读取从键盘或文件输入的数据 expr 四则远算和字符串运算 tmux 一个窗口操作多个会话 ...
- python验证卡普耶卡(D.R.Kaprekar)6174猜想
1955年,卡普耶卡(D.R.Kaprekar)对4位数字进行了研究,发现一个规律: 对任意各位数字不相同的4位数,使用各位数字能组成的最大数减去能组成的最小数,对得到的差重复这个操作,最终会得到61 ...
- Jmeter接口测试操作
一.Jmeter接口测试操作步骤 1. 启动jmeter,右键点击测试计划-->添加-->Threads(Users)-->线程组,点击线程组菜单,右边显示参数设置. 2 . 右键点 ...
- 【asp.net】asp.net实现上传Excel文件并读取数据
#前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:Fil ...
- Git复制已有分支到新分支开发
如果我们需要在现有的分支代码基础上,复制代码到新分支进行开发,并推送至远程仓库,可以进行如下操作: 注:被复制的分支代码(ibis35),创建新的分支(ibis35-dev) 1. 切换到被copy的 ...