我有一些数据结构实现,这里是scheme
interface Structure {
//some methods
}
class SomeRealization implements Structure {
...
}
class AnotherRealization implements Structure {
...
}
我使用char array
和FileChannel
以CharBuffer
的形式手动对它们进行序列化。是的,我可以通过writeObject
方法执行相同操作,但nio
比ObjectOutputStream
更快。
我想定义mixin旨在保存序列化/反序列化方法,目的是使项目可扩展,并且因为实现的序列化/不实现的算法不同。像这样的东西
interface StructureIO {
void saveStructure(String filename);
Structure loadStructure(String filename);
}
因此,如果我为结构的实现实现此接口,我将需要调用loadStructure(String filename)
方法的实例,这不合适,实际上这很糟糕。
是的,我可以在Java 8中将loadStructure(String filename)
方法定义为静态,但它不会给我任何东西,因为静态方法无法覆盖。
所以如果你有一些想法,请写信 在此先感谢;)
答案 0 :(得分:2)
如果您不愿意容忍loadStructure
- 我认为您可以通过让对象创建为未初始化然后使用loadStructure
进行初始化来实现 - 那么您就赢了能够强制执行反序列化作为接口合同的一部分。
MySpecificClass.deserialize(InputSourceType source)
(替换为文件名,InputStream
或您认为合适的任何抽象。< / p>
答案 1 :(得分:2)
如果您可以覆盖此静态方法,那么您将如何使用它?在调用方法之前必须决定要实例化哪个类,但是你需要开始读取文件才能这样做。
我的观点是,你想要的是一种读取文件和创建Structure对象的方法:
Structure s = loadStructure(filename);
问题是,这个方法需要知道它可以构建的所有子类,并且需要从文件本身读取应构建的子类。
因此,您需要一些公共代码来开始读取文件,并根据文件中的类型信息调用正确类的静态方法。使用一个知道它们的工厂类,并允许子类自己定义静态方法,而不通过接口强制执行(无论如何你都不需要)。
答案 2 :(得分:1)
Java有一个手动序列化的接口:Externalizable。
即使java.nio更快(这是许多其他Stack Overflow讨论的主题),它也不可能明显更快。磁盘I / O可能更成为瓶颈。
即使自定义方法确实可以获得性能提升,但我怀疑您不会进行此加载并经常保存以满足需要。出于这些原因,我只会使用Externalizable,并避免额外的复杂性。