У меня есть существующая внутренняя модель данных для Picture
, как показано ниже:
package test.model;
public class Picture {
private int height, width;
private Format format;
public enum Format {
JPEG, BMP, GIF
}
// Constructor, getters and setters, hashCode, equals, toString etc.
}
Теперь я хочу сериализовать ее с использованием протокольных буферов .Я написал файл Picture.proto, который отражает поля класса Picture
, и скомпилировал код в пакете test.model.protobuf
с именем класса PictureProtoBuf
:
package test.model.protobuf;
option java_package = "test.model.protobuf";
option java_outer_classname = "PictureProtoBuf";
message Picture {
enum Format {
JPEG = 1;
BMP = 2;
GIF = 3;
}
required uint32 width = 1;
required uint32 height = 2;
required Format format = 3;
}
Теперь я сейчаспри условии, что если у меня есть Picture
, который я хочу сериализовать и отправить куда-то, я должен создать PictureProtoBuf
объект и отобразить все поля, например:
Picture p = new Picture(100, 200, Picture.JPEG);
PictureProtoBuf.Picture.Builder output = PictureProtoBuf.Picture.newBuilder();
output.setHeight(p.getHeight());
output.setWidth(p.getWidth());
Я отклеиваюськогда у меня есть перечисление в моей модели данных.Уродливый способ, которым я сейчас пользуюсь:
output.setFormat(PictureProtoBuf.Picture.Format.valueOf(p.getFormat().name());
Однако это может привести к поломке и основано на том, что имя перечисления согласовано между моей внутренней моделью данных и моделью данных буфера протокола (которая неЭто отличное предположение, поскольку имена перечислений в файлах .proto должны быть уникальными).Я вижу, что мне приходится вручную создавать операторы switch для перечислений, если вызов .name()
из внутренней модели не соответствует имени перечисления, сгенерированному с помощью protobuf. * 1022 *
Я предполагаю, что мой вопрос:об этом правильный путь?Я должен отказаться от моей внутренней модели данных (test.model.Picture
) в пользу сгенерированной протобуфом (test.model.protobuf.PictureProtoBuf
)?Если да, как я могу реализовать некоторые тонкости, которые я сделал в моей внутренней модели данных (например, hashCode()
, equals(Object)
, toString()
и т. Д.)?