Java 手动序列化接口
Java interface for manual serialization
我有一些数据结构的实现,这里是方案
interface Structure {
//some methods
}
class SomeRealization implements Structure {
...
}
class AnotherRealization implements Structure {
...
}
我使用 FileChannel
和 CharBuffer
以 char array
的形式手动序列化它们。是的,我可以用 writeObject
方法做同样的事情,但是 nio
比 ObjectOutputStream
.
快
我想定义 mixin 旨在容纳 serialization/deserialization 方法,目的是使项目可扩展,并且因为 serialization/deserealization 实现的算法不同。像这样
interface StructureIO {
void saveStructure(String filename);
Structure loadStructure(String filename);
}
因此,如果我为实现 Structure 实现此接口,我将需要实例来调用 loadStructure(String filename)
方法,这不合适,事实上这很糟糕。
是的,我可以在 Java 8 中将 loadStructure(String filename)
方法定义为静态方法,但它什么也不会给我,因为静态方法无法被覆盖。
所以如果你有什么想法,请写
提前致谢 ;)
如果您不愿意容忍 loadStructure
——我想您可以通过让未初始化的对象创建然后用 loadStructure
初始化它们来做到这一点——那么您将无法做到将可反序列化作为接口契约的一部分。
然而,这不一定是一场灾难,因为首先进行通用反序列化并不一定有意义。当您查看序列化的字节流(或字符,我想,在您的情况下)时,您需要知道它是什么类型才能理解它。因此,不一定需要通用反序列化,您只需编写 MySpecificClass.deserialize(InputSourceType source)
(替换为文件名、InputStream
或您认为合适的任何抽象)。
如果你可以覆盖这个静态方法,你会如何使用它?必须在调用方法之前决定实例化哪个 class,但您需要开始读取文件才能执行此操作。
我的观点是,您在这里想要的是一种读取文件并创建 Structure 对象的方法:
Structure s = loadStructure(filename);
问题是,此方法需要知道它可以构建的所有子 classes,并且需要从文件本身读取 应该 构建哪个.
因此,你需要在某处使用一些通用代码来开始读取文件,并根据文件中的类型信息调用正确的静态方法class。使用一个知道所有这些方法的工厂 class,并允许子 classes 自己定义静态方法,而不是通过接口(你根本不需要)强制执行它。
Java有手动序列化的接口:Externalizable.
即使 java.nio 更快(这是许多其他 Stack Overflow 讨论的主题),也不太可能快得多。磁盘 I/O 可能更像是一个瓶颈。
即使自定义方法确实可以提高性能,我怀疑您执行此加载和保存的次数不会足够频繁以致需要它。出于这些原因,我将只使用 Externalizable,并避免额外的复杂性。
我有一些数据结构的实现,这里是方案
interface Structure {
//some methods
}
class SomeRealization implements Structure {
...
}
class AnotherRealization implements Structure {
...
}
我使用 FileChannel
和 CharBuffer
以 char array
的形式手动序列化它们。是的,我可以用 writeObject
方法做同样的事情,但是 nio
比 ObjectOutputStream
.
我想定义 mixin 旨在容纳 serialization/deserialization 方法,目的是使项目可扩展,并且因为 serialization/deserealization 实现的算法不同。像这样
interface StructureIO {
void saveStructure(String filename);
Structure loadStructure(String filename);
}
因此,如果我为实现 Structure 实现此接口,我将需要实例来调用 loadStructure(String filename)
方法,这不合适,事实上这很糟糕。
是的,我可以在 Java 8 中将 loadStructure(String filename)
方法定义为静态方法,但它什么也不会给我,因为静态方法无法被覆盖。
所以如果你有什么想法,请写 提前致谢 ;)
如果您不愿意容忍 loadStructure
——我想您可以通过让未初始化的对象创建然后用 loadStructure
初始化它们来做到这一点——那么您将无法做到将可反序列化作为接口契约的一部分。
然而,这不一定是一场灾难,因为首先进行通用反序列化并不一定有意义。当您查看序列化的字节流(或字符,我想,在您的情况下)时,您需要知道它是什么类型才能理解它。因此,不一定需要通用反序列化,您只需编写 MySpecificClass.deserialize(InputSourceType source)
(替换为文件名、InputStream
或您认为合适的任何抽象)。
如果你可以覆盖这个静态方法,你会如何使用它?必须在调用方法之前决定实例化哪个 class,但您需要开始读取文件才能执行此操作。
我的观点是,您在这里想要的是一种读取文件并创建 Structure 对象的方法:
Structure s = loadStructure(filename);
问题是,此方法需要知道它可以构建的所有子 classes,并且需要从文件本身读取 应该 构建哪个.
因此,你需要在某处使用一些通用代码来开始读取文件,并根据文件中的类型信息调用正确的静态方法class。使用一个知道所有这些方法的工厂 class,并允许子 classes 自己定义静态方法,而不是通过接口(你根本不需要)强制执行它。
Java有手动序列化的接口:Externalizable.
即使 java.nio 更快(这是许多其他 Stack Overflow 讨论的主题),也不太可能快得多。磁盘 I/O 可能更像是一个瓶颈。
即使自定义方法确实可以提高性能,我怀疑您执行此加载和保存的次数不会足够频繁以致需要它。出于这些原因,我将只使用 Externalizable,并避免额外的复杂性。