用于将对象转换为/从字节转换的设计模式

时间:2018-04-28 20:05:26

标签: java design-patterns

我有一个A类,它包含几个其他类B,C和D as shown的实例。

我想将A类及其内容转换为字节数组并将它们存储在一个文件中。后来我想从文件中读取字节数组并将其转换回A类as shown here的实例。我在设计一个在对象和字节数组之间来回转换的优雅解决方案时遇到了麻烦。

我考虑过的一个解决方案是创建一个可以在所有对象和字节数组之间来回转换的转换器类:

public Converter{

   public static ClassA getInstance(byte[] b){...return new ClassA()}
   public byte[] getBytes(ClassA classA){...}

   public static ClassB getInstance(byte[] b){...return new ClassB()}
   public byte[] getBytes(ClassB classB){...}

}

这种方法导致了一个非常大的类,有很多方法。

另一种方法是制作一个"转换器类"对于我想要存储在文件中的每个类。

public ClassAConverter extends Converter<ClassA>{

   public ClassA getInstance(byte[] b){...return new ClassA()}
   public static byte[] getBytes(ClassA classA){...}

}

public ClassBConverter extends Converter<ClassB>{

   public ClassB getInstance(byte[] b){...return new ClassB()}
   public static byte[] getBytes(ClassB classB){...}

}

然而,这种设计似乎具有创建大量类的缺点。

我知道Java Serialization实现了我在此所描述的大部分内容,但我正在寻找一种更灵活,更自定义的解决方案,该解决方案还可以使文件被其他独立解析程式。此外,文件大小是一个问题,使用自定义二进制格式可以提高空间效率。

是否有任何设计模式可以帮助更优雅地实现转换逻辑?

2 个答案:

答案 0 :(得分:1)

我不是java程序员,但除非大小真的很重要,否则我会使用json序列化程序。我相信你有一个lib,允许你根据自己的喜好自定义它,并且可以被任何其他程序使用。

答案 1 :(得分:0)

你不应该在这里重新发明轮子,序列化对象有许多现有格式,甚至还有更多用于将它们从java对象转换为Java对象的库。

最常见的格式是XML或JSON。要在java中编写和读取这些格式,您可以使用JAXB,Jackson或GSON。由于大小效率对您很重要,您可以在将生成的XML / JSON存储到文件系统之前对其进行压缩(java为GZipInputStream和GZipOutputStream。或者您可以使用Okio的GZipSink / GZipSource)。

如果你真的想使用自定义二进制格式,我建议使用protobuf:https://developers.google.com/protocol-buffers/ 在这里,您将在特殊的.proto文件中描述数据格式,protobuf将为您生成java类和所有解析代码。