在没有switch语句的情况下反序列化子类。

时间:2013-06-18 16:36:56

标签: java polymorphism

这更像是一个软件工程问题。 我有一个基类,以及扩展基类的类。我的目标是有一种更简洁的方式来反序列化,例如String。我目前的解决方案是获取此序列化字符串,从预定类型字段中提取“类型”,然后使用switch语句调用相应的子类'反序列化方法。有没有办法通过利用Java语言而不是切换语句来做到这一点?

public abstract class Base {
   String type;
}

public class A extends Base{
   public A(String serializedString){...}
}

public class B extends Base{
   public B(String serializedString){...}
}

public class AuxMethods {

   public static Base deserialize(String s){
       String type = extractType(s); // gets the type from the serialized object string
       Base deserialized = null;
       switch(type){
           case "A":
              deserialized = new A(s);
              break;
           case "B":
              deserialized = new B(s);
       }

  }

}

2 个答案:

答案 0 :(得分:3)

存储完整的类名(或假设所有类都在特定的包中),使用Class.forName,然后查找字符串构造函数以创建对象。

答案 1 :(得分:0)

我认为你没有以正确的方式使用序列化。您应该简单地序列化Base对象本身(使用ObjectOutputStream),而不是存储它指向的子类对象的字符串类名。实际的对象类型将自动与Java一起存储在序列化的子类对象中。

这种方式在反序列化时(使用ObjectInputStream),您自动获取相同的子类对象,而不使用switch-case语句来确定Base类引用应指向哪个对象