【Java】Serializable 接口
本文为大便一箩筐的原创内容,转载请注明出处,谢谢: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 接口的更多相关文章
- Java Serializable接口(序列化)理解及自定义序列化
1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...
- Java中的Serializable接口transient关键字,及字节、字符、对象IO
1.什么是序列化和反序列化Serialization是一种将对象转为为字节流的过程:deserialization是将字节流恢复为对象的过程. 2.什么情况下需要序列化a)当你想把的内存中的对象保存到 ...
- Java 序列化Serializable接口
1 什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2 什么情况下需要 ...
- 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成
写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么 ...
- Java基础知识强化104:Serializable接口 与 Parcelable接口
1. 什么是 序列化 和 反序列化 ? 序列化 :序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序 ...
- JDK源码阅读(五)java.io.Serializable接口
package java.io; public interface Serializable { } (1)实现Serializable接口的类,将会被提示提供一个 serialVersionUID ...
- (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
原文地址:http://blog.csdn.net/kenthong/article/details/5758884 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的 ...
- Effective Java 第三版—— 86. 非常谨慎地实现SERIALIZABLE接口
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- Java序列化接口Serializable接口的作用总结
一.Java序列化接口Serializable的作用: 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字 ...
随机推荐
- JetBrains ReSharper 8.2 Build 8.2.0.2160 && StyleCop
先安装 StyleCop 再安装 JetBrains ReSharper 8.2 Build 8.2.0.2160
- 用python简便地抓取刘昊然的写真(17行代码)
17行python代码抓取刘昊然图片之家的写真 用python来爬取网页信息是很简便的.因为它有很多库来帮助我们实现我们想要的功能.本实验用到的库有:requests和bs4中的BeautifulSo ...
- appium实现adb命令 截图和清空EditText
原文地址http://www.cnblogs.com/tobecrazy/p/4592405.html 原文地址http://www.cnblogs.com/tobecrazy/ 该博主有很多干货,可 ...
- Python之验证码
Python生成随机验证码,需要使用PIL模块. 安装: ? 1 pip3 install pillow 基本使用 1. 创建图片 ? 1 2 3 4 5 6 7 8 9 from PIL impor ...
- CNN学习笔记:梯度下降法
CNN学习笔记:梯度下降法 梯度下降法 梯度下降法用于找到使损失函数尽可能小的w和b,如下图所示,J(w,b)损失函数是一个在水平轴w和b上面的曲面,曲面的高度表示了损失函数在某一个点的值
- HDOJ 1159 Common Subsequence【DP】
HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- Hadoop创始人Doug Cutting寄语2017:五种让开源项目成功的方法
原文链接:http://www.infoq.com/cn/news/2017/01/Hadoop-2017-5-open-source?utm_source=tuicool&utm_mediu ...
- 负载均衡集群ipvsadm命令及基本用法
ipvsadm是LVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置.需要使用yum单独安装. 基本用法: ipvsadm COMMAND [protocol] service-addre ...
- WPF ListBox ItemContainerStyle 设置BackGround 和 BorderBrush 无效
今天更改ListBox,用到ItemContainerStyle设置样式,设置Style.Triggers时,BackGround和BorderBrush均无效,其他效果正常. 翻看WPF编程宝典,发 ...
- jQuery多层级垂直手风琴菜单
在线演示 本地下载