我在Java中声明了一个ISerializable接口。
基本上有两个方法:serialize()
和deserialize(byte[] buffer)
。
public interface ISerializable{
byte[] serialize();
deserialize(byte[] buffer);
}
以下是实现此接口的类的示例:
public class MySerializableClass implements ISerializable{
byte[] serialize(){bla bla}
deserialize(byte[] buffer){bla bla};
}
理想情况下,我希望调用
deserailize
的过程是隐式的。也就是说,在调用构造函数 MySerializableClass(byte[] buffer)
时,它会自动调用正确的 deserialize
函数,并将缓冲区传递给它。如下所示:public abstract class AbstractSerializable {
public abstract byte[] serialize();
public abstract void deserialize(byte[] buffer);
public AbstractSerializable (){}
public AbstractSerializable (byte[] buffer){
deserialize();
}
}
public class MySerializableClass extends AbstractSerializable {
byte[] serialize(){bla bla}
deserialize(byte[] buffer){bla bla};
}
据我所知,在构造函数中调用虚函数是有问题的,这可能导致未定义的行为。 因此,目前我正在执行以下操作:
MySerializableClass myClass = new MySerializableClass();
myClass.deserialize(buffer);
或者使用为每个扩展我的接口的类定义的专用静态方法(基本上只需执行上述2行代码):
MySerializableClass myClass = MySerializableClass.CreateMySerializableClass(buffer);
我的问题是:是否有一种优雅的方法可以做到这一点,而无需为实现ISerializable接口的每个类定义一个专用的静态方法? 是否有任何设计模式可以解决这个问题?
注意:我的序列化是独特的,所以我需要自己编写它,并且出于技术原因,我只能使用Java的基本功能(没有注释、模板元数据等),因此我需要一个非常基本的面向对象解决方案。