先来说一下什么是序列化与反序列化?

序列化:

永久的保存对象,保存对象的字节序列到本地文件中

反序列化:

将保存到本地文件中的对象读取到内存中,还原成这个对象

如何实现序列化与反序列化?

一个类如果想被序列化,则必须实现java.io.Serializable接口,这个接口没有定义任何方法,是一个标志性接口,当一个类实现了该接口,就表示这个类的对象是可以被序列化的

下面说一下序列化的时候,需要注意的问题

1.当一个对象被序列化的时候,只保存对象的非静态成员变量,因为静态成员与方法是属于类的成员

2.如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存

3.如果一个可序列化对象包含了某个不可序列化对象的引用,那么整个序列化是会失败的,并且会抛出一个NotSerializableException,我们可以将这个引用标记为transient,表示为短暂的,此时该变量就无法被序列化,然后对象依旧可以被序列化

下面介绍一下序列化与反序列化用到的两个对象与方法

1.序列化对象与方法

上面序列化是要把对象写出去,因此就要用到ObjectOutputStream流

这里还需要说明一点的就是,序列化一般在外部存储文件,该文件的扩展名一般就叫.ser

2.反序列化的对象与方法

下面我们来看代码实例

先来看我们需要序列化的一个类

Person

package domain;import java.io.Serializable;
import java.util.Date;public class Person implements Serializable {String name;int age;String gender;//添加了一个短暂属性,表明这个字段不可别序列化transient Date birthday;public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}
}

序列化类SerializeTest1.java

package test;import domain.Person;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Date;public class SerializeTest1 {public static void main(String[] args) throws IOException {Person p = new Person();p.setName("王二麻子");p.setAge(520);p.setGender("男");p.setBirthday(new Date());//建立一个序列化对象FileOutputStream fis = new FileOutputStream("D:/w.ser");ObjectOutputStream oos = new ObjectOutputStream(fis);oos.writeObject(p);oos.close();fis.close();}
}

这个就会在指定位置给我们产生一个文件

但是你不要打开这个看啊,因为这个肯定是乱码,毕竟是一个序列化文件,属于正常情况

然后去看我们的反序列化文件Deserialize.java

package test;import domain.Person;import java.io.*;public class DeserializeTest1 {public static void main(String[] args)  {//将文件进行反序列化Person p = null;//建立一个反序列化对象//这里是.ser序列化的文件FileInputStream fis = null;ObjectInputStream objectInputStream = null;try {fis = new FileInputStream("D:/w.ser");objectInputStream = new ObjectInputStream(fis);p = (Person) objectInputStream.readObject();} catch (Exception e) {e.printStackTrace();}finally{try {objectInputStream.close();} catch (IOException e) {e.printStackTrace();} finally {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}//上面就会反序列化之前我们在文件中存放的对象//然后访问一下之前创建的对象System.out.println("Name: " + p.getName());System.out.println("age: " + p.getAge());System.out.println("gender: " + p.getGender());System.out.println("birthday: " + p.getBirthday());}
}

运行结果:

这里在说一下为什么birthday是NULL,不是之前设置了值吗?你忘啦,我们添加了transient短暂属性,所以它不会被序列化的。

再见。

javase之序列化与反序列化相关推荐

  1. JavaSE——IO(下)(Properties类、序列化与反序列化)

    第3节 IO(下) 一..properties文件与Properties类 1.1 .properties文件介绍 .properties文件一种属性文件,以键值对 的格式存储内容,在Java中可以使 ...

  2. JavaSE进阶590-597 序列化和反序列化/IO和Properties联合

    开始时间:2021-01-05 对象的序列化和反序列化 将Java对象放在硬盘的操作->序列化(拆分对象) serialize 传的时候是一个数据包一个数据包的传,传的每个部分都有编号(应该用的 ...

  3. Android序列化与反序列化

    1. 什么是java序列化,如何实现java序列化? 我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他 ...

  4. JAVA进阶教学之(序列化和反序列化)

    目录 1.序列化Serialize和反序列化的概念 2.序列化和反序列化的代码演示: 3.序列化多个对象(序列化集合) 4.transient关键字将部分属性不参与序列化 1.序列化Serialize ...

  5. [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  6. 序列化和反序列化实现

    1. 什么是序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入文件或是将其传输到网络中的另一台计算机上以实现通讯.这个将程序数据转换成能被存储并传输的格式的过程被称 ...

  7. Json的序列化和反序列化

    1.引用命名空间: using System.Runtime.Serialization; 2.json的序列化和反序列化的方法: publicclass JsonHelper { ///<su ...

  8. C#实现对象的Xml格式序列化及反序列化

    要序列化的对象的类: [Serializable] public class Person { private string name; public string Name { get { retu ...

  9. c语言xml序列化,C# XML和实体类之间相互转换(序列化和反序列化)

    我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...

最新文章

  1. 相机数据格式设置不对踩坑
  2. spring中lazy-init详解
  3. 测度定义_Real analysis:外测度的一个等价定义
  4. javax.xml.datatype.XMLGregorianCalendar
  5. 【图像超分辨率】SR for RS via Local–Global Combined Network
  6. springcloud 整合 gateway_从Spring Cloud到Kubernetes的微服务迁移实践
  7. python各种类型转换-int,str,char,float,ord,hex,oct等
  8. mongo php 自增,PHP7下MongoDB自增或自减一个字段的值
  9. 20-spring学习-Spring MVC基本操作
  10. 内核开发知识第二讲,编写Kerner 程序中注意的问题.
  11. 大数据、物联网、区块链:融合趋势三重奏的好处
  12. 2020阿里云线上峰会预告 | 凌云时刻
  13. 如何进行cad地理配准_如何对扫描图片进行ArcGIS配准?
  14. 中坚力量:Isilon
  15. LeetCode学习资料和刷题顺序
  16. APK编辑器v2.4.3强行修改app背景图、去广告、重新架构等
  17. 零基础学FPGA(四):IP是什么东西(什么是软核,硬核)
  18. Unity中,区别LookAt与LookRotation
  19. Excel数据透视表笔记
  20. matlab标准化和反标准化——zscore

热门文章

  1. 单链表实例(1)实现水浒传排行增删改查和练习
  2. splash : runjs()
  3. Jsp查看编码进行转换
  4. 全球与中国聚丙烯齐格勒-纳塔催化剂市场十四五发展状况及投资风险研究报告2022-2028年
  5. python htmlparser怎么用_HTMLParser模块怎么在python中使用
  6. 华为云服务-运维篇-应用健康状况追踪-性能监测
  7. ChatGPT神器!三步让你轻松阅读论文文档
  8. 论:MongoDB的好坏丑
  9. Fancy PCA图像扩充总结(附代码)
  10. Android 9.0 以上http链接提示无网络和加载失败