一、序列化

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类添加一个属性,再进行反序列化 反序列化失败

最新文章

  1. HTML实体符号代码速查表
  2. 网络通信分享(一):数字签名,数字证书,https通信,数据加密
  3. 在mac上安装svn客户端
  4. 【多路复用】I/O多路复用
  5. JavaScript之获取和设置元素属性
  6. spring_boot打jar包及打包错误的解决方法
  7. fopen参数
  8. python学习笔记(十 三)、网络编程
  9. JDBCTM中Statement接口提供的execute、executeQuery和executeUpdate之间的区别
  10. DWR第二篇之逆向Ajax
  11. 关于QT Graphics View开启OpenGL渲染后复选框、微调框等无法正常显示的问题
  12. NPOI导出excel(2.0.6版本)
  13. zabbix疑难之时区问题
  14. URL加载jar
  15. C#中属性和字段的区别
  16. SpringBoot 跨域 Access-Control-Allow-Origin 问题
  17. session过期情况下ajax请求不会触发重新登录的问题
  18. js中将文件的base64转换成file并上传到服务器
  19. android 启动流程
  20. 167. Add Two Numbers【easy】

热门文章

  1. Linux(Ubuntu)使用日记------markdown文件与pdf,doc,docx文件的相互转化(pandoc使用)
  2. plus调用android原生页面
  3. ABP拦截器之AuthorizationInterceptor
  4. html2canvas 识别 svg 解决方案
  5. yii2 命令行执行php命令 commands(命令)
  6. 重学JavaScript - 数组
  7. gcc编译C源文件
  8. luogu5290 春节十二响
  9. pwn入门题x2
  10. javaWeb使用百度编辑器上传图片的问题