1

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

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);
       }

  }

}
4

2 回答 2

3

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

于 2013-06-18T16:38:41.803 回答
0

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

这样,当您反序列化(使用ObjectInputStream)时,您会自动获得相同的子类对象,而无需使用语句来确定类引用应该指向switch-case哪个对象。Base

于 2013-06-18T17:12:38.190 回答