可序列化的铸造和不优选使静态变量可序列化

时间:2013-11-19 15:45:22

标签: java inheritance serialization casting static

几个问题:

  1. 当我在阅读对象时进行投射....为什么我必须使用B o_b = (B) one;,为什么不使用A o_b = (A) one?对象类型为A,我已将其保存在文件中。另外,我想确认当我们制作一个物体时 像这样A a = new B()这行中的对象类型是什么?

  2. 此外,为什么不使用对象保存类?

  3. 为什么不保存静态变量(可序列化)?

  4. 代码:

    import java.io.*;
    
    class A {
    
        public void go(int height){
        }
    
    }
    
    public class B extends A implements Serializable{
    
        int height;
    
        public void go(int height){
            this.height = height;
            System.out.println("height is" + height);
        }
    
    
    
     public static void main(String[] args){
            A a = new B();
            a.go(43);
            //Saving Object 
            try{
                FileOutputStream f = new FileOutputStream("foo.ser");
                ObjectOutputStream o = new ObjectOutputStream(f);
                o.writeObject(a);
                o.close();
               // Reading an Object
               FileInputStream filestream = new FileInputStream("foo.ser");
               ObjectInputStream p = new ObjectIntputStream(filestream);
               Object one = p.readObject();
               //Casting
               B o_b = (B) one;
               p.close();
               System.out.println("saved values were" + o_b.height);
            } catch (Exception ex){
                ex.printStackTrace();
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

  1. 让我们先看一下A a = new B()的类型。变量a的静态类型为A,而动态类型为B。因此,当您在代码中使用a时,就好像它是A类型一样,它在运行时指向类型为B的对象。您可能想要了解多态性。这也解释了为什么您可以将反序列化的对象强制转换为B,尽管您序列化了a。实际序列化的对象是B类型。您可以将a的初始化更改为A a = new A(),并且转换将在运行时失败。此外,您应该已经为未经检查的强制转换获取编译器警告,这基本上意味着无法确保投射在运行时成功。
  2. 您还可以序列化所谓的类对象。使用Class<A> classA = A.getClass(),您将获得类A的类对象,并且能够序列化它。
  3. 您正在序列化实例。静态变量不是实例的一部分,它属于从中创建的实例的类。我认为您可以通过序列化类对象来序列化静态变量(参见2.)但我不确定。
  4. 我希望这能回答你的问题。请记住,并非所有可以完成的事情都应该完成。我会考虑序列化一个类对象坏设计。肯定有更好的方法来保存静态变量的内容。