扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:builder.com.cn 2007年4月3日
关键字:
Externalizable 接口
对于序列化对象,有时候你会有特殊要求。例如,你的对象可能有一些安全敏感的部分,就像密码,对这些内容你不希望保留并传送到其他地方。或者,在保存主要对象中所引用的另一个对象显得毫无用处时,因为在恢复之后它的数值将没有利用价值。
你在控制序列化的过程中,可以不采用Serializable接口,取而代之,你可以采用Externalizable接口。这个接口扩充了原来的Serializable接口,加入了writeExternal() 和 readExternal()方法。这两个方法在对象的序列化和反序列化中自动被调用,通过它们,你可以控制整个过程。
在serialization 和 externalization之间有一个极大的不同:对于externalization,当你序列化一个Externalizable对象时,有一个默认的构造函数会被自动调用;只有在那之后才会轮到readExternal()函数被调用。清单 C向你显示了如何使用externalization。
清单 C
import java.io.*;
import java.util.*;
class Data implements Externalizable {
inti;
String s;
public Data() {
System.out.println("Data default constructor");
}
public Data(String x, int a) {
System.out.println("Second constructor");
s = x; i = a;
}
public String toString() {
return s + i;
}
public void writeExternal(ObjectOutput out)
throws IOException {
out.writeObject(s);
out.writeInt(i);
}
public void readExternal(ObjectInput in) {
s = (String)in.readObject();
i = in.readInt();
}
public static void main(String[] args)
throws IOException, ClassNotFoundException {
Data d = new Data("String value",1514);
System.out.println(d);
ObjectOutputStream o = new ObjectOutputStream(
New FileOutputStream("data.out"));
o.writeObject(d);
o.close();
// Now deserialize
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("data.out"));
d = (Data)in.readObject();
}
}
如果你从采用Externalizable接口的类继承了一些类,那么为了正确的保存和恢复这个对象,你必须在序列化或反序列化时调用writeExternal()和readExternal()方法。
“transient”(临时)关键词
如果你不想保存或还原每一个成员变量(例如,保存在字符串对象中的密码),冠以“private”(私有)修饰字将无济于事。你可以采用Externalizable接口,这已在上一段阐述。这种情况下不会自动写入任何东西,并且你可以控制整个过程。
可是,serializable对象要方便许多,因为一切都会自动进行序列化。这时,你可以藉transient修饰字禁止成员变量对象的序列化。它会告诉JVM:“请不要保存和恢复这个字段;有其他人会照管好这个字段的。”清单D显示了其大体情况。
清单 D
import java.io.*;
import java.util.*;
class LoginCredentials implements Serializable {
private String username;
private transient String password;
LoginCredentials(String name, String password) {
username = name;
this.password = password;
}
public static void main(String[] args)
throws IOException, ClassNotFoundException {
LoginCredentials = new LoginCredentials("peter","mikhalenko");
}
}
Peter V. Mikhalenko是得到Sun认证的专业人员,他是Deutsche Bank的商务顾问。
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者