Шаблон проектирования для преобразования объектов в / из байтов - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть класс A, который содержит экземпляры нескольких других классов B, C и D , как показано .

Я хочу преобразовать класс A и его содержимое в массив байтов и сохранить их в файле. Позже я хочу прочитать байтовый массив из файла и преобразовать его обратно в экземпляр класса A , как показано здесь . У меня возникают проблемы при разработке элегантного решения, которое конвертирует туда-сюда объекты и байтовые массивы.

Одним из решений, которое я рассмотрел, было создание одного класса конвертера, который может конвертировать туда и обратно между всеми моими объектами и байтовыми массивами:

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 голосов
/ 29 апреля 2018

Вы не должны изобретать колесо здесь, есть много существующих форматов для сериализованных объектов и даже больше библиотек для преобразования их из и в объекты Java.

Наиболее распространенными форматами являются XML или JSON. Для написания и чтения этих форматов в Java вы можете использовать JAXB, Jackson или GSON. Поскольку эффективность размера важна для вас, вы можете сжать сгенерированный XML / JSON перед сохранением его в файловой системе (для этого используйте java как GZipInputStream и GZipOutputStream. В качестве альтернативы вы можете использовать GZipSink / GZipSource от Okio).

Если вы действительно хотите использовать пользовательский двоичный формат, я рекомендую использовать protobuf: https://developers.google.com/protocol-buffers/ Здесь вы описываете свой формат данных в специальном файле .proto, а protobuf сгенерирует Java-классы и весь код синтаксического анализа для вас.

0 голосов
/ 28 апреля 2018

Я не программист java, но если размер действительно не имеет значения, я бы использовал сериализатор json. Я уверен, что у вас есть библиотека, которая позволяет вам настроить ее так, как вам нравится, и может использоваться любой другой программой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...