本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4356840.html


参考资料:

http://xiebh.iteye.com/blog/121311

http://www.cnblogs.com/guanghuiqq/archive/2012/07/18/2597036.html

http://www.cnblogs.com/vicenteforever/articles/1471775.html

http://blog.csdn.net/kkdelta/article/details/3958930

一、定义

Serializable(序列化)是 Java 提供的一种保存对象状态的机制。实现序列化接口后,类的实例可以通过输入输出流保存或读取当前的状态(即对象当前成员变量的值)。

二、使用场合

1. 将对象的状态保存到文件或数据库中时

2. 在网络上通过套接字传输对象时

3. 通过 RMI(RemoteMethodInvocation,远程方法调用)传输对象时

三、序列化实现示例

import java.io.*;

public class  Box implements Serializable
{
private int width;
private int height; public void setWidth(int width){
this.width = width;
}
public void setHeight(int height){
this.height = height;
} public static void main(String[] args){
Box myBox = new Box();
myBox.setWidth(50);
myBox.setHeight(30); try{
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myBox);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}
} }

四、注意事项

1. 序列化只能保存对象的非静态成员变量,不能保存任何成员方法和静态成员变量,而且序列化保存的只是变量的值,对于变量的任何修饰符都不能保存。

本人博客地址,防止无脑抄袭,影响阅读见谅:http://www.cnblogs.com/dbylk

2. transient 关键字

需要序列化的类中可能会包含某些无法恢复状态的变量或者不希望被序列化的变量,此时我们可以通过 transient 关键字标明这些变量。比如一个 Thread 对象或一个 FileInputStream 对象,即使保存了状态也无法为它们重新分配资源,此时必须使用 transient 关键字标明,否则编译器会报错;又比如需要在网络上发送一个对象时,某些需要保密字段会面临安全问题,我们不希望它们与其他数据一起被发送,此时可以通过 transient 关键字保证该字段不会被序列化,达到保密的目的。

3. serialVersionUID

serialVersionUID 被用来验证类的版本一致性。进行反序列化时,JVM 会比较字节流中的 serialVersionUID 与本地类型的 serialVersionUID,如果相同,则认为字节流中的对象与本地对象是一致的,可以进行反序列化,否则会抛出序列化版本不一致的异常(InvalidCastException)。serialVersionUID有两种显示的生成方式:一种是默认的1L,比如:private static final long serialVersionUID = 1L;一种是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。点击 Eclipse 的warning 图标即可看到两种生成方式。如果不想定义它,可以在在Eclipse的设置把它关掉的,设置如下:Window -> Preferences -> Java -> Compiler -> Error/Warnings -> Potential programming problems 将 Serializable class without serialVersionUID 的 warning 改成 ignore 即可(不建议关闭,因为定义该值后可以避免反序列化时 JVM 对它的计算,可以带来小幅的性能提升)。

4. 当一个父类实现序列化时,子类自动实现序列化。

5. 当一个对象的实例变量为其他对象的引用时,序列化该对象的同时,它的引用对象也会被序列化。

【Java】Serializable 接口的更多相关文章

  1. Java Serializable接口(序列化)理解及自定义序列化

      1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...

  2. Java中的Serializable接口transient关键字,及字节、字符、对象IO

    1.什么是序列化和反序列化Serialization是一种将对象转为为字节流的过程:deserialization是将字节流恢复为对象的过程. 2.什么情况下需要序列化a)当你想把的内存中的对象保存到 ...

  3. Java 序列化Serializable接口

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

  4. 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成

    写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...

  5. Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

    Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么 ...

  6. Java基础知识强化104:Serializable接口 与 Parcelable接口

    1. 什么是 序列化 和 反序列化 ?     序列化 :序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序 ...

  7. JDK源码阅读(五)java.io.Serializable接口

    package java.io; public interface Serializable { } (1)实现Serializable接口的类,将会被提示提供一个 serialVersionUID ...

  8. (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

    原文地址:http://blog.csdn.net/kenthong/article/details/5758884 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的 ...

  9. Effective Java 第三版—— 86. 非常谨慎地实现SERIALIZABLE接口

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  10. Java序列化接口Serializable接口的作用总结

    一.Java序列化接口Serializable的作用: 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字 ...

随机推荐

  1. Sum---poj1844(数学题)

    题目链接:http://poj.org/problem?id=1844 题意:给一个整数n,求当n由1到k的连续整数加或减组成时的最小的k. 如果n全部由加法组成,那么k可以组成k(k+1)/2,设减 ...

  2. php socket 处理只是来数据流,该怎样避免(好像是堵塞了)

    php socket 处理只是来数据流,该怎样处理(好像是堵塞了) 需求:php接受一个硬件往8888port上发送数据,假设收到后,应socket_send函数返回"\xFA\x01\x0 ...

  3. Python3+Selenium3自动化测试-(一)

    完成环境的安装并测试之后,我们对Selenium有了一定的了解了,接下来我们继续驱动浏览器做一些基本操作: 窗口尺寸设置.网页截图.刷新.前进和后退 窗口尺寸设置 在测试过程中,我们可能会要求打开浏览 ...

  4. Mahout学习路线图-张丹老师

    前言 Mahout是Hadoop家族中与众不同的一个成员,是基于一个Hadoop的机器学习和数据挖掘的分布式计算框架.Mahout是一个跨学科产品,同时也是我认为Hadoop家族中,最有竞争力,最难掌 ...

  5. 转:asp.net获取url各项参数

    假设当前页完整地址是:http://www.test.com/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 "www.te ...

  6. react className 样式控制

    1.<div className={ "formbox " + this.state.classArr }></div> 2. this.state.cla ...

  7. 20145201《Java程序设计》第五次实验报告

    实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 我负责客户端 组队队员:鄢曼君20145227负责服务器 博客地址:htt ...

  8. Gradle 引入本地定制 jar 包,而不使用坐标下载 jar 包的方法

    第 1 步:创建文件夹,拷贝 jar 包 在自己的 Gradle 项目里建立一个名为 “libs” (这个名字可以自己定义,不一定非要叫这个名字)的文件夹,把自己本地的 jar 包拷贝到这个文件夹中. ...

  9. NSwag在asp.net web api中的使用,基于Global.asax

    https://github.com/NSwag/NSwag/wiki/OwinGlobalAsax This page explains how to use the NSwag OWIN midd ...

  10. java基础(6)--数组和方法

    数组 1. 什么是数组? 数组是相同数据类型的元素组成的集合.这些元素按线性顺序排列.所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素:除最后一个元素外,每一个元素都有唯一的后继元素.(“ ...