java中静态不能被序列化的疑问 10

importjava.io.ObjectOutputStream;importjava.io.IOException;importjava.io.FileOutputSt... import java.io.ObjectOutputStream;

import java.io.IOException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
class ObjectStreamDemo{
public static void writeObj()throws IOException{
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("Person.txt"));//创建写入指定 OutputStream 的 ObjectOutputStream。
//此构造方法将序列化流部分写入底层流

oos.writeObject(new Person("zhang",12,"haha"));//将指定的对象写入 ObjectOutputStream
/*
对象的类、类的签名(SerialVersionUID),以及类及其所有父类的非瞬态和非静态字段的值都将被写入
*/

oos.close();
}

public static void readObj()throws IOException,ClassNotFoundException{
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("Person.txt"));//创建从指定 InputStream 读取的 ObjectInputStream。

Person p=(Person)ois.readObject();//将读取流中的一个对象返回,当有多个对象可以采用循环读取
//注意该方法上声明两个异常(IOException,ClassNotFoundException)
System.out.println(p.toString());

}
public static void main(String[] args)throws IOException,ClassNotFoundException{

writeObj();
readObj();

}
}
import java.io.Serializable;
public class Person implements Serializable{
private static final long serialVersionUID=100L;
private String name;
int age;
private static String country="cn";
public Person(String name,int age,String country){
this.name=name;
this.age=age;
this.country=country;//非静态可以访问静态
}
public String toString(){

return name+"..."+age+"..."+country;
}
}
问题就是:结果是 zhang...12...haha
但是如果:
先writeObj(),然后readObj()
结果zhang...12...cn (这个是正确的)
麻烦大神门详细解释下,出现上述情况的原因.
展开
 我来答
王吧爷
推荐于2018-04-08
知道答主
回答量:39
采纳率:100%
帮助的人:13.1万
展开全部
对象的序列化是操作的堆内存中的数据,静态的变量又称作类变量。类一加载,就初始化了。静态变量在方法区里。zhang,,12,,haha这个对象是可以创建的,非静态可以访问静态。当你序列化zhang,,12,,haha这个对象的时候,类的静态变量是先于非静态加载进来的。当序列化的时候,首先读到了静态的,后边的非静态就不会被取走。所以我们说,序列化静态的变量是没有意义的。非静态的变量如果不想被序列化可以用transient修饰。
白羊movf
2021-05-27
知道答主
回答量:4
采纳率:0%
帮助的人:2752
展开全部
原因很简单,对象流中的readObject()不会调用构造函数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-07-03
展开全部
静态不能。想做,就对各个属性做序列化。
追问
你运行试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2022-02-10
展开全部
zhang...12...haha:
该结果的出现是由于main中连续进行了序列化和反序列化,都是在同一个JVM中进行的,即使反序列化时无法获取country,但在序列化时设置了country=haha,所以可以取到haha。这是由于static可以在同一个JVM中共享变量。
zhang...12...cn:
对比上述方法,使用了不同的JVM来进行序列化 / 反序列化。在序列化时,先取到了静态的haha,后面的非静态不会被取走,所以在后面修改这个属性是没意义的,无法被序列化。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式