序列化Serializable的学习笔记
来源:互联网 发布:淘宝店铺三个月 编辑:程序博客网 时间:2024/06/13 12:41
如何将对象序列化呢?
通过使用ObjectOutputStream来将内存中的对象进行序列化,通过ObjectInputStream来将InputStream反序列化为对象。
通常我们用它们装饰FileOutputStream/FileInputStream,以通过文件将序列化后的对象进行存储,或者从文件中将对象反序列化。例如:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
public class Persistence implements Serializable{
private static Map variables = null;
private static String tmpFile = "D:/tmpFile.bin";
static {
try {
if (new File(tmpFile).exists()) {
FileInputStream fis = new FileInputStream(tmpFile);
ObjectInputStream in = new ObjectInputStream(fis);
//从文件中将序列化后的对象读出,并反序列化后赋值给一个变量,这里
//反序列化后的对象时Object类型,需要向下转换为相应类型
variables = (Map)in.readObject();
in.close();
}
if (variables == null) {
variables = new HashMap();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void setVariables(String name,Serializable object) {
if (variables != null) {
variables.put(name, object);
}
FileOutputStream fos;
try {
fos = new FileOutputStream(tmpFile);
ObjectOutputStream out = new ObjectOutputStream(fos);
//将对象序列化后,存入fos所指向的文件中
out.writeObject(variables);
//清空缓存
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Serializable getVariables(String name) {
if (variables != null) {
return (Serializable)variables.get(name);
}
return null;
}
}
即:将FileOutputStream的输出流用ObjectOutputStream来包装,用writeObject(variables)来将对象序列化后,通过FileOutputStream来将序列化后的对象保存在文件中;ObjectInputStream包装输入流FileInputStream,将输入流中的内容用readObject()方法来反序列化为对象。
注意:
1、要序列化一个对象,则该对象及其属性都必须是实现了Serializable接口的,否则会报异常
2、要序列化一个对象,但又不希望他的某些属性被序列化,可以在这些属性的前面用transient
修饰,这样被transient修饰的属性就不会被序列化了;
3、当反序列化一个对象的时候,其构造方法不会被调用;
4、对象->文件->对象(即序列化,反序列化过程),在这个过程汇中,如果对象所属的类发生变化,将无法成功反序列化;
5、当对象被序列化之后,改变了对象所属的类,又希望对象可以被反序列化
——在JDK1.5以后,可以通过在类中定义serialVersionUID来解决问题
——在JDK1.4以前,不可以
serialVersionUID 实际上就是个版本号,可以通过IDE自动生成这个版本号,也可以自己手动输入一个,它是static final long类型的。通过定义serialVersionUID 就可以解决上述问题。只要保证序列化后的文件中的serialVersionUID和类中的serialVersionUID 是一样的,即使该类被改变了,对象同样可以反序列化,但如果二者不一样,即使类没有被改变,对象也不能反序列化。所以是否能够反序列化就要看serialVersionUID 是否相同。- 序列化Serializable的学习笔记
- JAVA学习笔记(三十一)- 对象序列化Serializable
- android学习笔记3 - 序列化接口Parcelable、Serializable的使用与区别
- 学习 java 序列化(Serializable )
- 序列化Serializable的理解
- java的serializable序列化
- java序列化Serializable 学习入门
- Android学习-Serializable、Parcelable序列化
- Java for Web学习笔记(八八):消息和集群(3)序列化Serializable
- 关于类的序列化[Serializable]
- C#序列化(Serializable)的使用
- C# 类的序列化[Serializable]
- Java Serializable(序列化)的理解
- 对象的序列化 Externalizable Serializable
- Java序列化的作用(Serializable/Externalizable)
- Java Serializable(序列化)的理解
- .net中[Serializable]序列化的应用
- C# 类的序列化[Serializable]
- 协议模拟编程之ADSL模式下IP自动换
- java中的重定向:forward/redirect
- java 性能优化总结
- 解决android有的手机拍照后上传图片被旋转的问题
- C#自动模拟用户登录发布或发布数据源码?--AliasNet
- 序列化Serializable的学习笔记
- 让Grails显示SQL记录
- Eclipse 安装SVN插件并从Google Code下载源码
- Windows32下安装MySQL详细教程(含图)
- C#开源信息抓取源码:首先介绍一下Jumony是什么?
- HTMLParser使用
- Android 浅谈ANR
- jQuery模板和数据绑定
- web 3D 前景、应用、开发语言和工具