java 序列化的问题

dj_归去来兮 发布于 2015/05/05 16:09
阅读 124
收藏 0
序列化是将对象状态转换为可保持或传输的格式的过程,它也是RMI用来在不同JVM之间传递对象的机制,或者通过方法的参数或者作为一个方法调用的返回值。但有三个例外序列化不需要读或者写入到流:
 
 
1. 序列化会忽略静态字段,因为他们不属于对象的任何状态。
 
 
2. 基类的字段只有基类本身是序列化的时候才能被序列化。
 
 

3. 瞬间字段(transient) 

我在写对象序列化时遇到了一点疑问,

代码如下:

public class Demo5 {
	public static void main(String[] args) throws Exception {
		 writeObj();
		readObj();

	}

	public static void writeObj() throws IOException {
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
				"obj.txt"));

		Person p = new Person("zhangsan", 22, "kr");

		oos.writeObject(p);
		oos.close();

	}

	public static void readObj() throws Exception {
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
				"obj.txt"));
		Person p = (Person) (ois.readObject());

		sop(p.toString());

	}

	public static void sop(Object obj) {
		System.out.println(obj);
	}
}

class Person implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -7002560338507231370L;
	private String name;
	private transient int age;
	static String country = "cn";

	Person(String name, int age, String country) {
		this.name = name;
		this.age = age;
		this.country = country;
	}

	public String toString() {
		return name + ":" + age + ":" + country;
	}

}
我发现当我分别在main中read()和write()时得到了我想要的结果(就是static变量不被序列化)

当我在main中同时使用read()和wirte()时 发现静态变量居然变了.

(自己暂时的揣测:文档中写的是不序列化static 变量,但是在被序列化的类的class文件没有被关闭的情况下,也就是write 和 read 同时执行,调用构造函数给static 变量初始化的值还存在内存中,因此反序列化的时候,JVM就会根据static变量指向的内存读取值,而在关闭当前class的情况写,也就是先执行write方法之后,再执行read方法,这期间,static变量的构造函数初始化的值在内存中不存在了,JVM就会使用它的初始值)

有人帮我解释一下这是为什么吗?



加载中
1
d
diy0118

静态变量是从属于类的,而不是对象的。当你两个方法放在一起运行的时候,sop(p.toString()) 获取的country实质上相当与Person.country.因为前面已经把country的值改kr,所以打印出了kr。与序列化反序列化没有关系。但是当你两个方法单独运行的时候,可以理解成扮演一个客户端一个服务器的角色。序列化的代码发送给服务器,服务器反序列化得到当然是初始值cn。个人觉得应该这么理解

dj_归去来兮
dj_归去来兮
恩,通俗易懂,也就是说,Person类的class在运行期间没有销毁的原因了
返回顶部
顶部