一、序列化

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--序列化和反序列化的更多相关文章

  1. Java序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  2. [转] Java序列化与反序列化

    原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ...

  3. Java序列化与反序列化(Serializable)

    Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...

  4. Java基础(五)-Java序列化与反序列化

    .output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...

  5. JAVA序列化和反序列化XML

    package com.lss.utils; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.Bu ...

  6. Java序列化与反序列化(实践)

    Java序列化与反序列化(实践) 基本概念:序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 昨天在一本书上 ...

  7. java序列化与反序列化(转)

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  8. Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨.  1.Java序列化与反序列化  Java序列化是指把Java对象转换为字节 ...

  9. (记录)Jedis存放对象和读取对象--Java序列化与反序列化

    一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...

  10. Java序列化与反序列化三连问:是什么?为什么要?如何做?

    Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...

随机推荐

  1. Linux系统安装jdk教程

    本文仅仅适用于刚刚接触Linux系统的童鞋,毕竟本人也才刚刚玩这个东西,在此记录下以便于以后能查阅及其他童鞋能进行参考,本文为原创随笔,如需转发,请标明出处,谢谢: 此处我采用的是用VMware搭建的 ...

  2. Spring项目定时任务

    最近某协会网站有个需求:显示当天访问量,很明显需要做俩步:一个是访问请求量的显示,一个需要每天00点恢复访问次数为0 所以需要做个定时任务:每天00点更新: 注解用法Spring配置: 1.在spri ...

  3. MySQL之字符集

    看unicode编码区从1 - 126就属于传统utf8区,当然utf8mb4也兼容这个区,126行以下就是utf8mb4扩充区 1.utf8与utf8mb4(utf8 most bytes 4) M ...

  4. Linux(Ubuntu)使用日记------部署JavaWeb项目到服务器

    0.前言 本博文内容是建立在你可以通过SSH连接到远程服务器的基础上的,如果你还没有用SSH连接到远程服务器,请参考此文(腾讯云服务器): http://www.cnblogs.com/hwtblog ...

  5. Python------Mongodb操作

    Python3要操作Mongodb需要下载pymongo,Linux下获取pymongo的方法也比较简单,控制台输入命令:sudo pip3 install pymongo 即可. Pymongo的文 ...

  6. vedio-js的视频插件用法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. LODOP获取打印成功,是否加入队列

    之前博文介绍过获取打印机状态码 LODOP获取打印机状态码和状态码含义测试,但是打印机种类千差万别,状态码不一定准确,特别是打印成功的状态码,获取任务不在队列,可以判断打印成功,删除任务也是任务不在队 ...

  8. NABCD--团队项目1

    N: 1.学校中有很多学生是外省的,然后不知道附近有什么地方周末可以去玩. 2.学校中学生有很多用不到的东西但是联系不到合适的买家. A: 我们可以做一个软件,通过学号注册登陆软件,这样可以防止有人去 ...

  9. python并发编程之多进程基础知识点

    1.操作系统 位于硬件与应用软件之间,本质也是一种软件,由系统内核和系统接口组成 和进程之间的关系是: 进程只能由操作系统创建 和普通软件区别: 操作系统是真正的控制硬件 应用程序实际在调用操作系统提 ...

  10. visual studio 中sstrcpy报错的问题

    项目->属性->C/C++->预处理器->预处理器定义->添加 _CRT_SECURE_NO_WARNINGS