序列化 是将对象的完整信息保存起来的过程(持久化)。    序列化流:ObjectOutputStream

反序列化 是将对象进行还原的过程(反持久化)。               反序列化流:ObjectInputStream

1.序列化

①一个对象想要被序列化,这个对象对应的类必须实现Serializable。Serializable接口中没有任何的方法和属性,仅仅用于标志这个类产生的对象可以被序列化。

②被static/transient关键字修饰的属性不会被序列化

③一个类在实现Serializable接口之后会默认添加一个属性serialVersionUID(版本号),默认是用private static final long 修饰,版本号的值会根据当前类中的属性和方法自动计算。一个对象在序列化的时候会把这个版本号一起序列化出去,反序列化的时候就会比较对象中的版本号和当前类的版本号是否一致---需要手动指定版本号,防止类产生微小改动的时候已经序列化的对象反序列化不回来。

④集合和大部分映射不能被序列化。

 import java.io.Serializable;

 public class Person implements Serializable {
private static final long serialVersionUID = 1984254532934148317L; private String name;
private int age;
private char gender;
private double weight;
private transient String cloth; // transient关键字标记的成员变量不参与序列化过程
public static String classroom; 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 getCloth() {
return cloth;
} public void setCloth(String cloth) {
this.cloth = cloth;
} public char getGender() {
return gender;
} public void setGender(char gender) {
this.gender = gender;
} public double getWeight() {
return weight;
} public void setWeight(double weight) {
this.weight = weight;
}
}

Person implements Serializable

 import java.io.FileOutputStream;
import java.io.ObjectOutputStream; public class ObjectOutputStreamDemo {
public static void main(String[] args) throws Exception {
Person p = new Person();
p.setName("肉丝");
p.setAge(3);
p.setCloth("无");
// p.classroom = "604"; // 创建序列化流
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\p.data"));
// 写出对象
out.writeObject(p);
// 关流
out.close();
}
}

2.反序列化

 import java.io.FileInputStream;
import java.io.ObjectInputStream; public class ObjectInputStreamDemo {
public static void main(String[] args) throws Exception {
// 创建反序列化流
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\p.data"));
// 读取对象
Person p = (Person) in.readObject();
in.close();
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getCloth());
// System.out.println(p.classroom);
}
}

结果:

【java学习笔记】序列化、反序列化的更多相关文章

  1. Java学习笔记——序列化和反序列化

    寒雨连江夜入吴,平明送客楚山孤. 洛阳亲友如相问,一片冰心在玉壶. --芙蓉楼送辛渐 持久化数据的第一种方式.在序列化之前也可以把数据打散逐行存储在文件中,然后在逐行读取. 比如定Student类 用 ...

  2. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  3. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  4. java学习笔记10--枚举

    java学习笔记10--枚举 在JDK1.5之前,java可以有两种方式定义新类型:类和接口.对于大部分面向对 象编程来说,这两种方法看起来似乎足够了,但是在一些特殊情况下,这些方法就不适合.例如,想 ...

  5. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  6. java学习笔记10--泛型总结

    java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5-- ...

  7. Java学习笔记【一、环境搭建】

    今天把java的学习重新拾起来,一方面是因为公司的项目需要用到大数据方面的东西,需要用java做语言 另一方面是原先使用的C#公司也在慢慢替换为java,为了以后路宽一些吧,技多不压身 此次的学习目标 ...

  8. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  9. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  10. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

随机推荐

  1. CentOS7修改主机名(hostname)

    Linux中的hostname在大多数应用中至为重要,例如有些应用强制使用主机名称而不能使用IP地址,如果默认主机名称都为localhost.localdomain 的话那一定会出现问题,而且看起来也 ...

  2. Django 部署到Nginx

    在网上搜了很多篇Django+uwsgi+Nginx的部署文章,忙了一下午头昏脑胀,最终完成了部署.部署文章流程讲解都很好,但在细节上或许缺乏一些注意力,导致我多篇文章来回切换在字里行间寻找蛛丝马迹. ...

  3. Asp.net mvc 中View 的呈现(二)

    [toc] 上一节介绍了 Asp.net mvc 中除 ViewResult 外的所有的 ActionResult,这一节介绍 ViewResult. ViewResultBase ViewResul ...

  4. 二目运算符 “->”

    -> 在C语言中称为间接引用运算符,是二目运算符,优先级同成员运算符“.”.用法:p->a,其中p是指向一个结构体的指针,a是这个结构体类型的一个成员.表达式p->a引用了指针p指向 ...

  5. 关于HTTP GET & POST的区别(转)

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE. URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTT ...

  6. Python学习笔记(二):字典

    字典由多个键及与其对应的值构成的键值对构成,字典中键唯一,值不唯一. 1)dict 函数: >>>items=[('name','lilei'),('age',12)] >&g ...

  7. Google chrome浏览器中通过扩展调用本地应用程序以及和程序相互通讯(C++)

    最近项目用到浏览插件的开发,IE用到的是BHO,chrome打算做成扩展. 但是和ie有一点不同,chrome扩展是基于html+js+css开发的,那么就会有二个问题 1. 代码和算法等容易被别人复 ...

  8. python基础(str,list,tuple)

    python是一门动态解释型的强类型定义语言(先编译后解释) 动态类型语言 动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来 解释型 程 ...

  9. SDP(6):分布式数据库运算环境- Cassandra-Engine

    现代信息系统应该是避不开大数据处理的.作为一个通用的系统集成工具也必须具备大数据存储和读取能力.cassandra是一种分布式的数据库,具备了分布式数据库高可用性(high-availability) ...

  10. 定制化WinPE

    1 .首先挂载wim Dism /Mount-WIM /WimFile:D:\install.wim /Index: /MountDir:D:\wimmount 2. 如何要修改WinPE的启动项,可 ...