我有一组小部件:FooWidget,BarWidget,BazWidget等,它们都具有某些共享功能以及一些非共享功能。我需要能够将这些对象序列化为某些特定的二进制格式,然后反序列化它们。这种二进制格式通过包含一个指示小部件类型的整数来区分不同类型的小部件(例如,FooWidget为1,BarWidget为2,BazWidget为3)。
我当前的方法是使每种类型的小部件成为扩展抽象Widget类的类。序列化在每个子类都覆盖的serialize
方法中执行。反序列化是通过Widget类中的静态方法完成的,该方法调用特定于子类的方法。
public abstract class Widget {
// ...
public abstract byte[] serialize();
public static Widget unserialize(byte[] b) {
switch (b[0]) {
case 1: return FooWidget.unserialize(b);
case 2: return BarWidget.unserialize(b);
case 3: return BazWidget.unserialize(b);
// ...
}
}
}
public class FooWidget extends Widget {
// ...
@Override
public byte[] serialize() { ... }
public static FooWidget unserialize(byte[] b) { ... }
}
// similar code for BarWidget, BazWidget, ...
我的问题是:有没有更好的方法来处理非序列化? Widget知道其所有子类的事实似乎并不是最佳实践,但是我看不出有更好的方法来实现这一点。