科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件学习何时序列化或外部化Java对象

学习何时序列化或外部化Java对象

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Java中对象的序列化(serialization)允许把采用Serializable接口的任何对象转换成字节流序列;同时它也允许把字节流序列转换回对象本身。

作者: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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章