一、概述

很多时候我们需要将对象的信息以文件的形式存储到硬盘上以便以后可以恢复使用。我们可以按照一定的格式将变量的值依次写到特定格式的文件中。但有时候我们希望只有我们自己可以读懂它并且修改它,这就是序列化的作用。

概念:将对象转化为字节序列的过程称为对象的序列化。而把字节序列恢复为对象的过程称为对象的反序列化。

序列化的两种主要用途:

(1):将对象的字节序列以文件的形式存储到硬盘上。

(2):在网络上传输对象的字节序列。

二、实现序列化

只需要让类实现Serializable这个接口即可。此接口没有任何方法,是一个标识性的接口用来标识此类可以被序列化。

三、具体例子

Pond.java

1 packagebean;2 importjava.io.Serializable;3

4 public class Pond implementsSerializable5 {6 private intlength;7 private intwidth;8 private intheight;9

10 public Pond(int length, int width, intheight)11 {12 this.length =length;13 this.width =width;14 this.height =height;15 }16

17 @Override18 publicString toString()19 {20 return length + ", " + width + ", " +height;21 }22 }

Test.java

1 packagetest;2 importjava.io.FileOutputStream;3 importjava.io.ObjectOutputStream;4 importbean.Pond;5

6 public classTest7 {8 @org.junit.Test9 public void test() throwsException10 {11 Pond small = new Pond(1, 2, 3);12 Pond middle = new Pond(4, 5, 6);13 Pond large = new Pond(7, 8, 9);14 System.out.println("Before");15 System.out.println(small);16 System.out.println(middle);17 System.out.println(large);18 FileOutputStream fos = new FileOutputStream("pond.hxy");19 ObjectOutputStream oos = newObjectOutputStream(fos);20 oos.writeObject(small);21 oos.writeObject(middle);22 oos.writeObject(large);23 oos.close();24 }25 }

pond.hxy中内容如下:

反序列化:

1 packagetest;2 importjava.io.FileInputStream;3 importjava.io.FileOutputStream;4 importjava.io.IOException;5 importjava.io.ObjectInputStream;6 importjava.io.ObjectOutputStream;7

8 importbean.Pond;9

10 public classTest11 {12 @org.junit.Test13 public void test() throwsIOException, ClassNotFoundException14 {15 Pond small = new Pond(1, 2, 3);16 Pond middle = new Pond(4, 5, 6);17 Pond large = new Pond(7, 8, 9);18 FileOutputStream fos = new FileOutputStream("pond.hxy");19 ObjectOutputStream oos = newObjectOutputStream(fos);20 oos.writeObject(small);21 oos.writeObject(middle);22 oos.writeObject(large);23 oos.close();24 small = null;25 middle = null;26 large = null;27 FileInputStream fis = new FileInputStream("pond.hxy");28 ObjectInputStream ois = newObjectInputStream(fis);29 small =(Pond)ois.readObject();30 middle =(Pond)ois.readObject();31 large =(Pond)ois.readObject();32 System.out.println(small);33 System.out.println(middle);34 System.out.println(large);35 System.out.println("运行结束");36 }37 }

运行结果:

si

四、序列化ID

private static final long serialVersionUID = 1L; 其实就是这个东西。它的作用可以理解成是用于唯一标识一个类的long型变量。

反序列化的时候,JVM会把字节流中的序列化ID和本地相应类的ID作比较,如果不一致则会抛出异常。

如果没有显示定义序列化ID,JAVA序列化机制会自动生成一个序列化ID,这种情况下,只有当时编译生成的类具有正确的序列化ID。

所以总的来说,显式地定义序列化ID有两种用途:

1、 在某些场合,希望类的不同版本对序列化兼容,需要确保类的不同版本具有相同的serialVersionUID。

2、 在某些场合,不希望类的不同版本对序列化兼容,需要确保类的不同版本具有不同的serialVersionUID。

五、其他说明

每次调用readObject()都会从stream中读出下一个对象,读取顺序与写入顺序是相同的,且次数超过会抛出异常。

当对象被序列化的时候,被该对象引用的实例变量也会被序列化。且所有被引用的对象也会被序列化。这些操作都是自动进行的。

如果其中有不能序列化的对象(没有实现序列化接口),执行期间会抛出异常。

反序列化后的对象与原对象内容相同,但是地址不同。所以序列化可以用来做深拷贝。

java 操作序列_JAVA序列化操作详解相关推荐

  1. serializable java 规则_Java 序列化Serializable详解(附详细例子)

    1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2.什么情况下需要序 ...

  2. java linkedlist 节点_JAVA学习-LinkedList详解

    1.定义 实现List接口与Deque接口双向链表,实现了列表的所有操作,并且允许包括null值的所有元素,对于LinkedList定义我产生了如下疑问: 1.Deque接口是什么,定义了一个怎样的规 ...

  3. java Serializable和Externalizable序列化反序列化详解--转

    一.什么是序列化?   "对象序列化"(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字 ...

  4. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

  5. java super实例_java Super 用法详解及实例代码

    java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java  Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...

  6. java enum 变量_java枚举使用详解

    package com.ljq.test; /** * 枚举用法详解 * * @author jiqinlin * */ public class TestEnum { /** * 普通枚举 * * ...

  7. java异常体系_JAVA异常体系结构详解

    一.什么是异常 异常:程序在运行过程中发生由于硬件设备问题.软件设计错误等导致的程序异常事件.(在Java等面向对象的编程语言中)异常本身是一个对象,产生异常就是产生了一个异常对象.      --百 ...

  8. java lang型_java.lang的详解

    java.lang包提供了利用 Java 编程语言进行程序设计的基础类,lang是单词language的开头.该包由Java语言自动调用,不需要显示声明. 一 接口 二 类 java.lang的类分为 ...

  9. java abstract 变量_Java基础知识详解:abstract修饰符

    abstract详解 abstract一般用来修饰类和方法. 1.abstract修饰类 abstract修饰类,会使得类变成抽象类,抽象类不能生成实例,但是可以作为对象变量声明的类型,也就是编译时类 ...

最新文章

  1. ReferenceQueue的使用
  2. java字符串的替换replace、replaceAll、replaceFirst的区别
  3. java邮件发送代码_用Java实现最简单的邮件发送代码
  4. Atitit。激活某个程序的api attilax总结
  5. linux6.5dns装什么,1、RHEL6.5下DNS服务器的安装及简单应用(一)
  6. express项目搭建 初始化详细步骤
  7. imagemagick, imagick和magickwand的安装
  8. zend studio12配置php,Zend Studio 12.0调试php代码
  9. unity实现打飞碟游戏
  10. 清除网页缓存的快捷键
  11. STM32F401RCT6最小系统原理图设计
  12. 读书百客:《十一月四日风雨大作》评赏
  13. Github项目(克隆,上传)简单git命令流程使用记录
  14. 洛谷刷题C语言:Even? Odd? G、The Robot Plow G、pb的游戏(1)、询问学号、cover
  15. win2003 64位系统IIS6.0 32位与64位间切换
  16. 杭电oj题目题型分类(转)
  17. client?0edb:161 [WDS] Errors while compiling. Reload prevented.
  18. 基于opencv的图片模板匹配及其简单应用
  19. 亮紫色晶体meso四(4-氨基苯基)卟啉TAPP/TAPPPt/TAPPCo/TAPPCd/TAPPZn/TAPPPd/TAPPCu/TAPPNi/TAPPFe/TAPPMn金属配合物-齐岳供应
  20. 大数据概述:传统数据与大数据的区别

热门文章

  1. 关于 Repeater 控件嵌套的使用。在嵌套中添加 其它控件(如:按钮),并影响其它控件的方法,很重要哦,测试通过。...
  2. 根据wsdl生成对应的Java代码进行接口测试(一)
  3. grads 相关系数_教程合集 | Grads数据处理基础
  4. python字符串_python字符串API
  5. 信捷电子凸轮使用_FM352电子凸轮使用指南
  6. [蓝桥杯][算法训练VIP]单词接龙(DFS+String)
  7. [蓝桥杯][算法提高VIP]排队打水问题(贪心)
  8. mysql实验学生表_数据库实验(学生信息表)
  9. PAT_B_1090_C++(25分)
  10. 【sklearn学习】逻辑回归