本文为大便一箩筐的原创内容,转载请注明出处,谢谢: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. 初识python (一)

    初识Python(一) python2和python3的一些区别 Python2 和 Python3 区别汇总:http://www.cnblogs.com/bigtreei/p/7806288.ht ...

  2. 我的Android进阶之旅------>解决:Failed to create 'build\outputs\apk\watch-debug-unaligned.apks': 拒绝访问。

    1. 错误描述 今天用Android Studio进行项目编译的时候,报错如下所示: FAILURE: Build failed with an exception. * What went wron ...

  3. PHP获取客户端的IP

    function getClientIP(){    global $ip;    if (getenv("HTTP_CLIENT_IP"))        $ip = geten ...

  4. sql server等待类型

    sql server 各种等待类型-转 sql server各个等待类型及解决办法:https://www.sqlskills.com/help/waits/writelog/其他等待类型的描述和解决 ...

  5. disruptor 高并发编程 简介demo

    原文地址:http://www.cnblogs.com/qiaoyihang/p/6479994.html disruptor适用于大规模低延迟的并发场景.可用于读写操作分离.数据缓存,速度匹配(因为 ...

  6. SSH 公钥检查

    SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击.但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查. 首 ...

  7. Django CSRF cookie not set.错误

    post提交表单报错: Forbidden (403) CSRF verification failed. Request aborted. You are seeing this message b ...

  8. java中文转Unicode

    public String cnToUnicode(String cn) { char[] chars = cn.toCharArray(); String returnStr = "&qu ...

  9. HashMap的简单源码分析(看了大佬的源码,基于1.7) put方法

    参考博客: https://blog.csdn.net/eson_15/article/details/51158865 hashMap中的几个关键属性 //默认初始容量是16,必须是2的幂 stat ...

  10. Windows 2008下系统网站运行环境的搭建

    1.右击[计算机]-->[管理],进入到”服务器管理器” 界面,如图所示: 2.依次展开[角色]-->[Web服务器(IIS)]-->[Internet 信息服务(IIS)管理器], ...