本文为大便一箩筐的原创内容,转载请注明出处,谢谢: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. 最全的Eclipse使用快捷键

    Eclipse 是一种基于 Java 的可扩展开源开发平台.尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言,Eclipse 还包括插件开发环境等,下面将为大家介 ...

  2. 让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求

    具体设置如下: 1. 调整IIS 7应用程序池队列长度 由原来的默认1000改为65535. IIS Manager > ApplicationPools >Advanced Settin ...

  3. 内置模块(time、random、hashlib、os)

    简介: 模块:本质上就是一个.py文件,使用其中的函数. 模块分为:内置函数.第三方模块.自定义模块. 今天学习的就是Python的内置函数. 回到顶部 一.time模块 1.时间的表示形式 在Pyt ...

  4. JAVA三框架工作原理是什么?

    一.struts的工作原理: 1.初始化,读取struts-config.xml.web.xml等配置文件(所有配置文件的初始化) 2.发送HTTP请求,客户端发送以.do结尾的请求 3.填充Form ...

  5. C#__ 模拟鼠标单击事件

    首先要用到的引用有 [DllImport("User32")] public extern static void mouse_event(int dwFlags, int dx, ...

  6. 添加github ssh 公钥

    1.在控制台输入命令: ssh-keygen -t rsa -C "github上的邮箱地址" 2.将公匙复制后添加到github网站:    id_rsa.pub文件 3.测试是 ...

  7. Python-Cpython解释器支持的进程与线程

    一.Python并发编程之多进程 1. multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在pyt ...

  8. CF961G Partitions(第二类斯特林数)

    题目 CF961G 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 相信大家能得出一个一眼式:\[Ans=\sum\limits_{i=1}^n w_i\sum\limi ...

  9. 纯CSS3滑动开关按钮

    在线演示 本地下载

  10. 20145219 《Java程序设计》第02周学习总结

    20145219 <Java程序设计>第02周学习总结 教材学习内容总结 类型:基本类型.类类型(参考类型) 基本类型: 整数:short占2字节,int占4字节,long占8字节 字节: ...