当前位置: 首页 > 面试题库 >

java静态变量序列化

金理
2023-03-14
问题内容

静态变量的值如何在序列化过程中持久化(如果完全持久化)。我在栈上读过类似的问题,它说静态变量本质上是瞬态的,即它们的状态或当前值未序列化。

我只是做一个非常简单的示例,我将一个类序列化并保存到文件中,然后再次从文件中重构该类。令人惊讶的是,我发现静态变量的值在序列化发生时和发生时都被保存了。

这是怎么发生的。这是因为类模板及其实例信息是在序列化期间保存的。这是代码片段-

public class ChildClass implements Serializable, Cloneable{

    /**
     * 
     */
    private static final long serialVersionUID = 5041762167843978459L;

    private static int staticState;
    int state = 0;

    public ChildClass(int state){
        this.state = state;
        staticState = 10001;
    }

    public String toString() {
        return "state" + state + " " + "static state " + staticState;
    }

    public static void setStaticState(int state) {
        staticState = state;
    }

这是我的主班

public class TestRunner {

    /**
     * @param args
     */
    public static void main(String[] args) {
        new TestRunner().run();
    }

    public TestRunner() {

    }

    public void run() {
        ChildClass c = new ChildClass(101);
        ChildClass.setStaticState(999999);
        FileOutputStream fo = null;
        ObjectOutputStream os = null;

        File file = new File("F:\\test");
        try {
            fo = new FileOutputStream(file);
            os = new ObjectOutputStream(fo);
            os.writeObject(c);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {

            try {
                if(null != os)os.close();
                if(null != fo) fo.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }


        FileInputStream fi = null;
        ObjectInputStream ois = null;
        ChildClass streamed;

        try {
            fi = new FileInputStream(file);
            ois = new ObjectInputStream(fi);
            Object o = ois.readObject();
            if(o instanceof ChildClass){
                streamed = (ChildClass)o;
                //ChildClass cloned = streamed.clone();
                System.out.println(streamed.toString());
            }
        } catch (IOException | ClassNotFoundException  e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                if(null != ois)ois.close();
                if(null != fi) fi.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

注意:代码没有错。我只是想知道如何在类’ChildClass’中保存静态变量’staticState’的值。如果我通过网络传输此序列化数据,那么将保存状态吗?


问题答案:

静态字段值未序列化。输出是打印静态字段的新值,仅仅是因为您已将其修改为999999,但从未在反序列化之前将其值重置为旧值。由于该字段是静态的,因此新值会反映在的
任何 实例中ChildClass

若要正确断言该字段未序列化,请在对对象进行反序列化之前将其值重置为10001,您会注意到其值不是999999。

...
ChildClass.setStaticState(10001);

FileInputStream fi = null;
ObjectInputStream ois = null;
ChildClass streamed;

...
// when de-serializing, the below will print "state101 static state 10001"
System.out.println(streamed.toString());


 类似资料:
  • 问题内容: 我已经定义了一个对象并声明了一个静态变量。在该方法中,当我尝试打印实例和类变量时,两者都打印相同的值。 不是实例变量吗?它应该打印0而不是50吗? 问题答案: 不,只有一个变量-您尚未声明任何实例变量。 不幸的是,Java允许您访问静态成员,就像通过相关类型的引用访问静态成员一样。这是IMO的设计缺陷,某些IDE(例如Eclipse)允许您将其标记为警告或错误- 但这是语言的一部分。您

  • 问题内容: 当我运行此代码时,答案是1,我想应该是2。初始化的顺序和每一步中k的值是什么? 编辑1:作为后续的“ k设置为默认值”,那么为什么下一个代码不能编译?出现错误“在定义字段之前无法引用它”。 编辑2:出于某种我不知道的原因,它^可以在其“ Test.k”代替“ k”时使用。 感谢所有的答案。这将满足:D 问题答案: 它们按照您编写它们的顺序执行。如果代码是: 然后输出变为2。 初始化的顺

  • 问题内容: 我有一个带有静态实例的android java类,其中包含一个用户信息。但是,在极少数情况下,当用户使用我的应用程序时,该静态实例中的变量之一会在一段时间后变为null。该Java类是全局的(未附加到任何活动)。是什么原因造成的? 编辑:该变量永远不会更改,除非在应用程序启动期间。我已经检查过调用它的函数永远不会被调用一次以上(adb logcat证明了当我添加一条日志表明正在被调用时

  • 问题内容: 根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。 我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象? 问题答案: 因为可能会造成混淆!静态成员上没有动态调度。 看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了) 看起来很混乱,因为方法似乎是多态的,所以输

  • 问题内容: 如何在Java中初始化类的私有静态成员。 尝试以下操作: 但是在创建类A的第二个对象然后调用f1()时,我得到了空指针异常。 问题答案: 初始化静态成员的首选方法是(如上所述) 或者对于更复杂的初始化代码,您可以使用静态初始化程序块:

  • 静态变量 PHP中局部变量分配在zend_execute_data结构上,每次执行zend_op_array都会生成一个新的zend_execute_data,局部变量在执行之初分配,然后在执行结束时释放,这是局部变量的生命周期,而局部变量中有一种特殊的类型:静态变量,它们不会在函数执行完后释放,当程序执行离开函数域时静态变量的值被保留下来,下次执行时仍然可以使用之前的值。 PHP中的静态变量通过