一、序列化和反序列化

序列化:把对象转换为字节序列的过程称为对象的序列化。

反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

将内存中对象的信息保存下来,可以有很多种方式实现这一功能。其中java提供了一种更好的保存对象状态的机制,那就是序列化。

应用场景:

  • 把内存中的对象状态保存到一个文件或者数据库中的时候;
  • 在网络上传送对象的时候;
  • 其他(以后再补充)

二、实例

import java.io.Serializable;

/**
* Created by jyy on 2018/6/4.
*/
public class Cat implements Serializable { public Cat(String id, String name) {
this.id = id;
this.name = name;
} private String id;
private String name;
public static String call = "喵喵喵"; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Cat{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", call='" + call + '\'' +
'}';
}
}
import java.io.*;

/**
* Created by jyy on 2018/4/19.
*/
public class Test { public static void main(String[] args){ Cat cat = new Cat("1001","Tom");
serialize(cat);
deserialize(); Cat.call = "喵";
deserialize();
} /**
* 序列化
*/
public static void serialize(Cat cat){ ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(new File("D:/other/cat.txt")));
oos.writeObject(cat);
System.out.println("序列化成功:"+cat);
}catch(IOException e){
System.out.println("Cat 对象序列化失败!");
}finally{
try {
oos.close();
}catch(IOException e){
System.out.println("输出流关闭失败!");
}
}
} /**
* 反序列化
*/
public static void deserialize(){ ObjectInputStream ois;
try {
ois = new ObjectInputStream(new FileInputStream(new File("D:/other/cat.txt")));
Cat cat1 = (Cat)ois.readObject();
System.out.println("反序列化成功:"+cat1);
}catch (Exception e){
System.out.println("Cat 对象反序列化失败!");
}
}
}

执行结果:

序列化成功:Cat{id='1001', name='Tom', call='喵喵喵'}
反序列化成功:Cat{id='1001', name='Tom', call='喵喵喵'}
反序列化成功:Cat{id='1001', name='Tom', call='喵'}

对象中非静态的成员变量“id”,“name”可以被序列化。但是静态成员变量“call”,不可以被序列化,因为它是属于类信息的一部分,而不属于对象。

如果某一成员变量不想被序列化,可以使用关键字“transient”进行修饰。

三、serialVersionUID

将序列化后的对象进行网络传输时,serialVersionUID将必不可少。

例如在客户端A中Cat类的serialVersionUID=1L,而在客户端B中Cat类的serialVersionUID=2L,那么就不能反序列化这个对象。

serialVersionUID有两种生成策略:

  • 一个是固定的 1L;
  • 一个是随机生成不重复的 long 类型数据(实际上是使用JDK工具根据类名、接口名、成员方法及属性等来生成);

JAVA基础知识|Serializable的更多相关文章

  1. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  2. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  3. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  4. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

  5. java基础知识一览(二)

    一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...

  6. 黑马毕向东Java基础知识总结

    Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记    侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...

  7. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  8. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  9. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

随机推荐

  1. 【转载】 C#中使用Sum方法对List集合进行求和操作

    在C#的List操作中,有时候我们需要对List集合对象的某个属性进行求和操作,此时可以使用Lambda表达式中的Sum方法来快速实现此求和操作,使用Sum方法可使代码简洁易读,并且省去写for循环或 ...

  2. 关于 table 那些事儿

    一.  table thead/tbody/tfoot 组合写法: table: 表格: thead: 表头: tbody: 标签表格主体(正文): tr:行: th:表头单元格 td:单元格: tb ...

  3. ORA-00001:unique constraint violated解决

    转自:https://www.2cto.com/database/201211/172340.html ORA-00001:unique constraint violated解决 今天往数据库中插入 ...

  4. 【坑】select2 模态框中下拉input无法focus

    select2的组件bug 解决方案: 在bootstrap.js中修改: Modal.prototype.enforceFocus = function () { $(document) .off( ...

  5. 对于Linux中文件描述符的疑问以及解决

    问题 ​ 每次web服务器或者是几乎所有Linux服务器都需要对文件描述符进行调整,我使用ulimit -n来查看当前用户的最多能打开的文件,默认设置的是1024个,但是系统运行起来以及开启一些简单的 ...

  6. Linux 之 用户、用户组以及权限

    拥有者(user),拥有组(group),其他人(other) 由于Linux是一个多人多任务的系统,因此经常会出现同一台机器同时有多个人进行操作,为了考虑每个人的隐私权以及每个人喜好的工作环境,所以 ...

  7. 四:MySQL系列之Python交互(四)

    该篇主要介绍MySQL数据库的分表.以及与Python的交互的基本操作等. 一.拆分表操作 1.1  准备工作 创建数据库 --> 使用数据库 --> 创建数据表 --- 添加记录 -- ...

  8. unittest 运行slenium(三)---通过数据驱动形式运行用例

    一: 获取数据 获取用例所在位置,通过OpenExcelPandas来读取用例里面的全部数据.通过某个列名来创建新的序号. 并将结果转换成list类型,将其作为ddt数据的来源. 1.  在test文 ...

  9. 13. 请看TED 的演讲, 谈谈你对压力的看法,以及怎么和别人合作, 帮助别人,把压力转化为动力,在互相帮助的环境中成长。------------答题者:徐潇瑞

    看了ted的演讲,我觉得压力就像一根弹簧,有多大的压力,它就有多大的弹力:现实中只要你学会用一种永远不服输的顽强精神,去对待人生和社会中遇到的一切困难与挫折,宠辱不惊的看云卷云舒,悟潮起潮落.可是存在 ...

  10. Stages — 研发过程可视化建模和管理平台

    Stages 是德国Method park公司的产品,用于帮助企业定义.管理.发布.控制.优化其研发过程,同时使其研发过程符合CMMI.ASPICE.ISO26262等标准.Stages的核心理念是把 ...