public class EventObject implements java.io.Serializable {
* The object on which the Event initially occurred.
*/
protected transient Object source;
再问下这里定义的source靠什么地方给它赋值的??
* The object on which the Event initially occurred.
*/
protected transient Object source;
再问下这里定义的source靠什么地方给它赋值的??
transient说明串行化的时候不需要把这个字段串行化。
我写了个小程序测试了一下;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class ObjectStream {
public static void main(String[] args)
{
T t = new T(1,2,3);
T tt = null;
try {
//将t对象写到hehe.txt文件里
FileOutputStream fos = new FileOutputStream("d:\\hehe.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(t);
oos.close();
//将tt从hehe.txt对象读出来
FileInputStream fis = new FileInputStream("d:\\hehe.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
tt = (T) ois.readObject();
System.out.println("i = "+tt.i+" j = "+tt.j+" k = "+tt.k);
ois.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}}class T implements Serializable
{
int i;
int j;
transient int k;
T(int _i,int _j, int _k)
{
this.i = _i;
this.j = _j;
this.k = _k;
}
}
运行结果是:
i = 1 j = 2 k = 0
解释:
执行T t = new T(1,2,3);这个语句时,k应该为3,可是为什么是0呢.因为k不被串行化,所以把对象写到文件的时候k并没有被写进去,所以输出的时候不时3,而是默认的初始化值0,所以k打印出来为0.
1、 java的serialization提供了一个非常棒的存储对象状态的机制,说白了serialization就是把对象的状态存储到硬盘上去,等需要的时候就可以再把它读出来使用。但是在存储对象状态时,我们有时候会需要特定的对象数据在serialization时不进行存储。这时候 transient关键字就派上用场了。要关掉类的特定的数据域,可以使用transient关键字进行定义,这对于底层的java虚拟机来说,这个 transient类型的变量不是一个类的永久性的状态。2、比如说在一个实体Bean中,transient和 static字段是非持久性字段,不能保存在数据库中。
另外,如果你的对象需要序列化到数据库、JDNI或通过Object流传递给其他对象的话,对象中的非持久性字段应该加transient关键字。3、 你如果写了一个程序并需要序列化到本地或者数据库中(不只是你一个人需要用),并且因为测试的缘故,你认为加上了自己的一些信息,例如用户名,密码(例如数据库的身份),这样方便测试.但是,这些信息是肯定不应该被别人知道或者了解的,同时呢,又不想每次自己都去写都去改,这样,你可以用 transient定义这样的变量存储它们.4、 下面是java规范中对transient关键字的解释:
The transient er is not fully specified by The Java Language Specification but is used in object serialization to member variables that should not be serialized.5、java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身。这可以极大地方便网络上的一些操作,但同时,因为涉及到安全问题,所以并不希望把类里面所有的东西都能存储(因为那样,别人可以通过序列化知道类里面的内容),那么我们就可以用上transient这个关键字,它的意思是临时的,即不会随类一起序列化到本地,所以当还原后,这个关键字定义的变量也就不再存在。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class ObjectStream {
public static void main(String[] args) {
T t = new T(1, 2, 3);
T tt = null;
try {
// 将t对象写到hehe.txt文件里
FileOutputStream fos = new FileOutputStream("d:\\hehe.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(t);
oos.close();
// 将tt从hehe.txt对象读出来
FileInputStream fis = new FileInputStream("d:\\hehe.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
tt = (T) ois.readObject();
System.out.println("i = " + tt.i + " j = " + tt.j + " k = " + tt.k);
ois.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}}class T implements Serializable {
int i;
int j;
transient int k; T(int _i, int _j, int _k) {
this.i = _i;
this.j = _j;
this.k = _k;
}
}
对象序列化技术主要是用在对象在网络上传输的,序列化后的对象在远程服务上能够被正确表示为原来的状态最近也是才看的这方面,不知道讲的对不对