浏览 2698 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-12
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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-12-12
最后修改:2008-12-12
并不是在序列化的时候把static内容写入了文件,而是在反序列化还原出一个对象的时候,你使用的static内容根本就不属于这个对象,而是这个class.
所以,即使序列化没有把static内容写入文件,你反序列化还原对象的时候也可以引入. 另外,你不应该在同一个JVM上去测试,而且static的内容不要在初始化的时候给它赋值,而是通过setter给它赋值. |
|
返回顶楼 | |
发表时间:2008-12-12
icyiwh 写道 并不是在序列化的时候把static内容写入了文件,而是在反序列化还原出一个对象的时候,你使用的static内容根本就不属于这个对象,而是这个class. 所以,即使序列化没有把static内容写入文件,你反序列化还原对象的时候也可以引入. 另外,你不应该在同一个JVM上去测试,而且static的内容不要在初始化的时候给它赋值,而是通过setter给它赋值. 对了,static内容是属于class,而不是object的。谢谢指点:) |
|
返回顶楼 | |
发表时间: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();
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();
|
|
返回顶楼 | |
发表时间:2008-12-12
最后修改:2008-12-12
对JDK中的注释重新理解: 注释没有错,因为static的属性不是和对象相关的,而是包括在类中。因为序列化的时候类的相关信息也写入,所以static属性的值也包括在其中了。 |
|
返回顶楼 | |