论坛首页 Java企业应用论坛

请教一个对象序列化问题:哪些field在序列化时会被写入stream中?

浏览 2698 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-12  
在查看java.io.ObjectOutputStream.writeObject(Object obj)方法的注释时,看到这句说明

Write the specified object to the ObjectOutputStream. The class of the object, the signature of the class, and the values of the non-transient and non-static fields of the class and all of its supertypes are written.

大致意思是:
将指定的对象写入到ObjectOutputStream中。有关这个对象的类的信息、类的签名、该类的非transient和非static的属性的值,以及该对象所有的父类都被写入ObjectOutputStream。

按照这个说明,non-static属性的值不会被写入,但在下面的例子中,static属性的值是被写入了的。

我想,这个应该是注释说明的错误吧?请教一下各位。


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Foo implements Serializable {
	private String name = "My name is foo.";
	private static String desc = "I will still be here!";
	private transient String abandoned = "I will be abandoned!";
	
	public Foo(){}
	
	public String toString(){
		StringBuilder result = new StringBuilder();
		result.append(name);
		result.append("-");
		result.append(desc);
		result.append("-");
		result.append(abandoned);
		return result.toString();
	}
	
	public static void main(String[] args) throws ClassNotFoundException, IOException{
		Foo foo = new Foo();
		System.out.println("foo = " + foo);
		
		ObjectOutputStream out = new ObjectOutputStream(
				new FileOutputStream("foo.out"));
		out.writeObject("Foo storage\n");
		out.writeObject(foo);
		out.close();
		
		ObjectInputStream in = new ObjectInputStream(
				new FileInputStream("foo.out"));
		String s = (String)in.readObject();
		Foo foo2 = (Foo)in.readObject();
		System.out.println(s + "foo2 = " + foo2);
		in.close();		
	}
}



输出结果:
foo = My name is foo.-I will still be here!-I will be abandoned!
foo2 = My name is foo.-I will still be here!-null


   发表时间:2008-12-12   最后修改:2008-12-12
  并不是在序列化的时候把static内容写入了文件,而是在反序列化还原出一个对象的时候,你使用的static内容根本就不属于这个对象,而是这个class.
  所以,即使序列化没有把static内容写入文件,你反序列化还原对象的时候也可以引入.

  另外,你不应该在同一个JVM上去测试,而且static的内容不要在初始化的时候给它赋值,而是通过setter给它赋值.
0 请登录后投票
   发表时间:2008-12-12  
icyiwh 写道

  并不是在序列化的时候把static内容写入了文件,而是在反序列化还原出一个对象的时候,你使用的static内容根本就不属于这个对象,而是这个class.
  所以,即使序列化没有把static内容写入文件,你反序列化还原对象的时候也可以引入.

  另外,你不应该在同一个JVM上去测试,而且static的内容不要在初始化的时候给它赋值,而是通过setter给它赋值.


对了,static内容是属于class,而不是object的。谢谢指点:)
0 请登录后投票
   发表时间:2008-12-12   最后修改:2008-12-12

先在main中执行如下代码

         Foo foo = new Foo();  
         Foo.desc = "Will write static value?";
         System.out.println("foo = " + foo);  
           
         ObjectOutputStream out = new ObjectOutputStream(  
                 new FileOutputStream("foo.out"));  
         out.writeObject("Foo storage\n");  
         out.writeObject(foo);  
         out.close();  


再在main中执行如下代码

         ObjectInputStream in = new ObjectInputStream(  
                 new FileInputStream("foo.out"));  
         String s = (String)in.readObject();  
         Foo foo2 = (Foo)in.readObject();  
         System.out.println(s + "foo2 = " + foo2);  
         in.close(); 


楼主看看两次输入的desc值还一样吗?

 

0 请登录后投票
   发表时间:2008-12-12   最后修改:2008-12-12


to whmily: 我这里执行了结果两次desc的还是一样的。

 

对JDK中的注释重新理解: 注释没有错,因为static的属性不是和对象相关的,而是包括在类中。因为序列化的时候类的相关信息也写入,所以static属性的值也包括在其中了。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics