tbwshc
关于Java序列化的一些高级用法
该说的都在注释中说完了。直接给程序吧。
[java] view plaincopyprint?
package test.javaPuzzler.p5;
import java.io.*;
import java.io.ObjectInputStream.GetField;
import java.io.ObjectOutputStream.PutField;
// 转载请注明来自http://blog.csdn.net/sunxing007
// 一个类实现Serializable来表明自己可以被序列化;
// 有一点需要特别注意的是:
// 如果子类实现了Serializable,而父类没有,则父类不会被序列化;
public class SerializableObject implements Serializable {
// 生成的序列化版本号会因为编译环境,声明的类名,成员名称和数量的变化而不同;
// 也就是说这个版本号一定程度上记录着类的定义性的信息,如果类的定义变化了,最好重新生成版本号;
// 如果新的代码使用了旧的版本号,则在反序列化的时候,可以兼容读取旧类的字节码而不会报错;
private static final long serialVersionUID = 9038542591452547920L;
public String name;
public String password;
// 如果你不希望某个非静态成员被序列化,可以用transient来修饰它;
public transient int age;
// 静态成员不会被序列化,因为序列化保存的是实例的状态信息,而静态成员是类的状态信息;
public static int version = 1;
public SerializableObject(String name, String password) {
this.name = name;
this.password = password;
}
// 每个类可以写一个writeObject方法,这个方法将会负责该类自身的序列化过程;
// 比如对于敏感信息如password,可以加密之后再序列化;
// 这个过程需要用到PutField,它可以指定哪些域会被序列化,怎么序列化(比如加密);
// 如果没有定义这个方法,将会调用ObjectOutputStream 的 defaultWriteObject;
// 你可以注释掉readObject方法,然后运行测试用例来测试密码是否被加密;
private void writeObject(ObjectOutputStream out) throws IOException {
PutField putFields = out.putFields();
putFields.put("name", name);
// 模拟加密密码
putFields.put("password", "thePassword:" + password);
out.writeFields();
}
// 每个类可以写一个readObjec
tb
方法,该方法负责该类自身的反序列化过程;
// 比如对序列化时加密后的密码解密;
// 这个过程需要用到GetField,他可以具体地读取每个域;或执行解密动作等等;
// 如果没有定义这个方法,将会调用ObjectInputStream 的 defaultReadObject;
private void readObject(ObjectInputStream in)
throws ClassNotFoundException, IOException {
GetField readFields = in.readFields();
// 读取到成员的值之后,直接赋给该域,即完成该域的反序列化;
name = (String) readFields.get("name", "defaultName");
// 模拟解密密码
String encPassword = (String) readFields.get("password",
"thePassword:defaultValue");
password = encPassword.split(":")[1];
}
// 序列化
// 主要用到ObjectOutputStream;
public void save() throws IOException {
FileOutputStream fout = new FileOutputStream("e:obj");
ObjectOutputStream oout = new ObjectOutputStream(fout);
oout.writeObject(this);
oout.close();
fout.close();
}
// 反序列化
// 主要用到ObjectInputStream
public static SerializableObject load() throws IOException,
ClassNotFoundException {
FileInputStream fin = new FileInputStream("e:obj");
ObjectInputStream oin = new ObjectInputStream(fin);
Object o = oin.readObject();
return (SerializableObject) o;
}
@Override
public String toString() {
return "name: " + name + ", password: " + password;
}
//
tb
测试用例
public static void main(String[] args) throws IOException,
ClassNotFoundException {
SerializableObject so = new SerializableObject(
"http://blog.csdn.net/sunxing007", "123456");
so.save();
System.out.println(so);
System.out.println(SerializableObject.load());
}
}
posted on 2013-06-17 16:50
chen11-1
阅读(149)
评论(0)
编辑
收藏
My Links
BlogJava
首页
联系
聚合
管理
Blog Stats
Posts - 193
Stories - 21
Comments - 56
Trackbacks - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
hibernate(1)
(RSS)
oracle(9)
(RSS)
我在东软(1)
(RSS)
随笔(5)
(RSS)
随笔档案
2013年10月 (3)
2013年9月 (4)
2013年8月 (2)
2013年7月 (2)
2013年6月 (5)
2013年5月 (1)
2012年9月 (36)
2012年8月 (61)
2012年7月 (50)
2012年6月 (27)
2012年5月 (2)
文章分类
java(5)
(RSS)
javascript(1)
(RSS)
oracle(5)
(RSS)
文章档案
2013年9月 (2)
2013年8月 (1)
2013年6月 (1)
2013年5月 (1)
2012年7月 (2)
2012年6月 (12)
2012年5月 (2)
新闻档案
2013年6月 (4)
2013年5月 (2)
2012年7月 (1)
2012年6月 (1)
tbw淘宝商城-首页
tbw淘宝商城-首页
(RSS)
tbw淘宝商城首页是集tbw淘宝网商城女装,男装,内衣,男鞋,女鞋,运动鞋,童装,手表,饰品,化妆品,手机,相机为一体的购物网站,tbw淘宝商城首页给推荐你最好淘宝店铺.
搜索
最新评论
1. re: js控制页面刷新等操作 [未登录]
1
--1
2. re: Java项目经验——程序员成长的关键
之前看了一遍,并没有完全理解,现在做了一段时间之后再回来读一次,有了更加深切的体会。
--xhzwxhz
3. re: Hibernate 所有缓存机制详解
神州行 我看行
--和大象掰腕子
4. re: 用html+js+css做一个模拟键盘 [未登录]
henhao
--陈浩
5. re: Hibernate 所有缓存机制详解[未登录]
太厉害了,写的太好了~
--微笑
阅读排行榜
1. java实现异步调用实例(22724)
2. Oracle 的Blob使用小结(17812)
3. Java项目经验——程序员成长的关键(13238)
4. PHP-FPM高负载的解决办法(11732)
5. 安装ORACLE时在Linux上设置内核参数的含义(10557)
评论排行榜
1. java实现异步调用实例(9)
2. Java项目经验——程序员成长的关键(5)
3. 解决jsp参数传递乱码的问题(3)
4. 文件FTP上传支持断点续传demo(3)
5. 提高代码可读性的十大注释技巧(2)
Powered by:
BlogJava
Copyright © chen11-1