思考下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import
java.io.Externalizable;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.ObjectInput;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutput;
import
java.io.ObjectOutputStream;
/**
* @descripiton Externalizable接口的使用
*
* @author Alexia
* @date 2013-10-15
*
*/
public
class
ExternalizableTest
implements
Externalizable {
private
transient
String content =
"是的,我将会被序列化,不管我是否被transient关键字修饰"
;
@Override
public
void
writeExternal(ObjectOutput out)
throws
IOException {
out.writeObject(content);
}
@Override
public
void
readExternal(ObjectInput in)
throws
IOException,
ClassNotFoundException {
content = (String) in.readObject();
}
public
static
void
main(String[] args)
throws
Exception {
ExternalizableTest et =
new
ExternalizableTest();
ObjectOutput out =
new
ObjectOutputStream(
new
FileOutputStream(
new
File(
"test"
)));
out.writeObject(et);
ObjectInput in =
new
ObjectInputStream(
new
FileInputStream(
new
File(
"test"
)));
et = (ExternalizableTest) in.readObject();
System.out.println(et.content);
out.close();
in.close();
}
}
|
content变量会被序列化吗?好吧,我把答案都输出来了,是的,运行结果就是:
1
|
是的,我将会被序列化,不管我是否被
transient
关键字修饰
|
这是为什么呢,不是说类的变量被transient关键字修饰以后将不能序列化了吗?
我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null。
转自:http://www.importnew.com/21517.html
今天又get到一点