什么是java序列化,如何实现?   序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。   序列化是为了解决在对 对象进行读写操作时所引发的问题。   序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要被实现的方法,implement Serializable只是为了标注该对象是可被序列化的,然后使用         一个输出流(如:fileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject方法就可以         将参数为obj的对象写出(即保存其状态),要恢复的话则利用输入流。

SerialVersionUID--下面简称SUID其实序列化的作用是能转化成Byte流,然后又能反序列化成原始的类。能在网络进行传输,也可以保存在磁盘中,有了SUID之后,那么如果序列化的类已经保存了在本地中,中途你更改了类后,SUID变了,那么反序列化的时候就不会变成原始的类了,还会抛异常,主要就是用于版本控制。

SUID:IDE一般会帮你自动生成,其实这个值你可以自己设定,只要保证id值唯一就好。你可以理解成唯一标识。

serialVersionUID是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出来的。

使用ObjectInputStream 反序列化的时候,ObjectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID进行对比,如果这两个id不一致,那么反序列化就失败了。

对象的输入输出流,主要的作用是用于写对象与读取对象的信息。对信息一旦写到文件上那么对象的信息就可以持久化了
package com.io.test;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.*;
import java.util.*;public class Test implements Serializable {//Serializable接口没有任何方法,只是一个标识接口public static void main(String[] args) throws Exception {new Test().test();}private void test() throws FileNotFoundException, IOException, ClassNotFoundException {Map<Integer, Film> map = new HashMap<Integer, Film>();map.put(1, new Film("变形金刚", 20));map.put(2, new Film("钢铁侠", 30));map.put(3, new Film("复仇者联盟", 40));/*,序列化其实就是将film的相关信息转化为二进制存储在了map.txt这个文件中,那么用文本编辑器打开查看的话当然是会出现乱码的。只有通过反序列化才能将存储的二进制读取出来,然后正常显示在控制台上。*/ObjectOutputStream oos =  new ObjectOutputStream(new FileOutputStream("map.txt"));oos.writeObject(map);oos.close();/*反序列化*/ObjectInputStream ois = new ObjectInputStream(new FileInputStream("map.txt"));Map<Integer, Film> m = new HashMap<Integer, Film>();m = (Map<Integer, Film>) ois.readObject();ois.close();System.out.println(m.toString());}class Film implements Serializable {//先执行序列化方法 唯一标识是1L  然后改成2L后   反序列化输出会报错private static final long serialVersionUID = 1L;private String name;private int duration;public Film(String name, int duration) {this.name = name;this.duration = duration;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getDuration() {return duration;}public void setDuration(int duration) {this.duration = duration;}public Film() {}@Overridepublic String toString() {return "Film{" +"name='" + name + '\'' +", duration=" + duration +'}';}}
}

对象输入输出流要注意的细节

  1. 如果对象需要被写到文件上,那么对象所属的类必须实现Serializable接口,Serializable接口没有任何方法,只是一个标识接口。
  2. 对象的反序列化创建对象的时候并不会调用到构造方法的。
  3. serialVersionUID是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出来的。
  4. 使用ObjectInputStream 反序列化的时候,ObjectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID进行对比,如果这两个id不一致,那么反序列化就失败了。
  5. 如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一个类制定了serialVersionUID,然后再序列化和反序列化的时候,jvm都不会再自己算这个serialVersionUID
  6. 如果一个对象某个数据不想被序列化到硬盘上,可以使用关键字transient修饰
  7. 如果一个类维护了另外一个类的引用,那么另外一个类也需要实现Serializable接口

Serializable接口相关推荐

  1. Java开发规范,不要新建一个类就实现Serializable接口

    个人网站:http://xiaocaoshare.com/ 作为一名java开发者,细节决定技术的高度和深度 一个java类什么时候需要实现Serializable接口 1.什么是Serializab ...

  2. java 只去掉_30行代码带你了解Java的Serializable接口

    最近本栈在阅读Java的源码,发现JDK的String类实现了Serializable接口,并定义了一个serialVersionUID变量,它知道这个接口是为了让String类能够序列化与反序列化, ...

  3. Parcelable与Serializable接口的用法和区别

    转自:https://www.cnblogs.com/jiefeiduan/p/3959411.html 1. Parcelable接口 Interface for classes whose ins ...

  4. Serializable接口初探

    类通过实现 java.io.Serializable 接口以启用其序列化功能.未实现此接口的类将无法使其任何状态序列化或反序列化.可序列化类的所有子类型本身都是可序列化的.序列化接口没有方法或字段,仅 ...

  5. javaBean为什么要实现Serializable接口?

    Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了 ...

  6. Idea中类实现Serializable接口 引入 serialVersionUID

    idea实现Serializable接口,然后打出serialVersionUID的办法 setting>editor>Inspection>Java>Serializatio ...

  7. Android --- Serializable 接口与 Parcelable 接口的使用方法和区别,怎么选择?

    文章目录 一.前言: 二.Serializable 接口 三.Parcelable 接口 四.两种接口怎么选择 一.前言: 本节主要讲解 IPC 中的基本概念,Serializable 接口与 Par ...

  8. serializable接口_Java Serializable:明明就一个空的接口嘛

    01.先来点理论 对于 Java 的序列化,我一直停留在最浅显的认知上--把那个要序列化的类实现 Serializbale 接口就可以了.我不愿意做更深入的研究,因为会用就行了嘛. 但随着时间的推移, ...

  9. 请解释为什么集合类没有实现Cloneable和Serializable接口?

    克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的.因此,应该由集合类的具体实现来决定如何被克隆或者是序列化. 实现Serializable序列化的作用: ...

最新文章

  1. MySQL的SQL语句如何优化?
  2. Raid技术在Linux下的使用
  3. 【WPF】使用 XAML 的 Trigger 系统实现三态按钮
  4. 写给前端的算法进阶指南,我是如何两个月零基础刷200题 等推荐
  5. 开源OSS.Social微信项目解析
  6. C语言fgets函数了解
  7. Java变量名命名规则
  8. redis安装、配置和启动
  9. 【转】Oracle DECODE函数的语法介绍
  10. 详细讲解大型数据库的设计原则与开发技巧
  11. 【收藏】韦东山嵌入式Linux课程梳理|随时更新
  12. IOS-objectiveC【语法】修饰符 static extern const
  13. ssh工具的使用(全平台运行)
  14. 自制裸眼3D图【推荐】
  15. 调试华为MML协议备忘
  16. Qt for WinRT
  17. MOOS-ivp 实验一 在linux系统中安装moos-ivp遇到的各种问题汇总
  18. JAVA练习 家庭记账本
  19. win10(版本1803,os ver 17134.165)内置Ubuntu子系统在vim中文乱码问题
  20. 音乐类型是怎么区分的?什么样的才算是摇滚?摇滚应该也是通俗音乐的一种吧?...

热门文章

  1. 为了成长,我所做的一些努力!
  2. sap服务器应用webservice加载spring的机制问题
  3. 华人“军火专家”——黄仁勋
  4. 阿里限流工具 Sentinel
  5. 芯盾时代:致力于身份认证安全的领军者
  6. 物联网:企业需要面临七大风险
  7. MYSQL外键(Foreign Key)的使用
  8. 在某些情况下明明添加了引用,为何VS还报错XXX不存在类型或命名空间(是否缺少程序集引用)...
  9. kint 一个强大的php调试助手
  10. Ubuntu 12.10 安装 jdk-7u10-linux-x64.tar.gz