用于手动序列化的Java接口

时间:2016-02-01 19:39:16

标签: java serialization architecture mixins

我有一些数据结构实现,这里是scheme

interface Structure {
  //some methods
}

class SomeRealization implements Structure {
  ...
}

class AnotherRealization implements Structure {
  ...
}

我使用char arrayFileChannelCharBuffer的形式手动对它们进行序列化。是的,我可以通过writeObject方法执行相同操作,但nioObjectOutputStream更快。

我想定义mixin旨在保存序列化/反序列化方法,目的是使项目可扩展,并且因为实现的序列化/不实现的算法不同。像这样的东西

interface StructureIO {
  void saveStructure(String filename);
  Structure loadStructure(String filename);
}

因此,如果我为结构的实现实现此接口,我将需要调用loadStructure(String filename)方法的实例,这不合适,实际上这很糟糕。

是的,我可以在Java 8中将loadStructure(String filename)方法定义为静态,但它不会给我任何东西,因为静态方法无法覆盖。

所以如果你有一些想法,请写信 在此先感谢;)

3 个答案:

答案 0 :(得分:2)

如果您不愿意容忍loadStructure - 我认为您可以通过让对象创建为未初始化然后使用loadStructure进行初始化来实现 - 那么您就赢了能够强制执行反序列化作为接口合同的一部分。

但是,这并不一定是灾难,因为首先进行通用反序列化并不一定有意义。当你查看一个序列化的字节流(或者我认为是chars,在你的情况下),你需要知道它是什么类型来理解它。因此,不一定需要通用反序列化,您只需要编写MySpecificClass.deserialize(InputSourceType source)(替换为文件名,InputStream或您认为合适的任何抽象。< / p>

答案 1 :(得分:2)

如果您可以覆盖此静态方法,那么您将如何使用它?在调用方法之前必须决定要实例化哪个类,但是你需要开始读取文件才能这样做。

我的观点是,你想要的是一种读取文件和创建Structure对象的方法:

Structure s = loadStructure(filename);

问题是,这个方法需要知道它可以构建的所有子类,并且需要从文件本身读取构建的子类。

因此,您需要一些公共代码来开始读取文件,并根据文件中的类型信息调用正确类的静态方法。使用一个知道它们的工厂类,并允许子类自己定义静态方法,而不通过接口强制执行(无论如何你都不需要)。

答案 2 :(得分:1)

Java有一个手动序列化的接口:Externalizable

即使java.nio更快(这是许多其他Stack Overflow讨论的主题),它也不可能明显更快。磁盘I / O可能更成为瓶颈。

即使自定义方法确实可以获得性能提升,但我怀疑您不会进行此加载并经常保存以满足需要。出于这些原因,我只会使用Externalizable,并避免额外的复杂性。