У меня есть существующая внутренняя модель данных для изображения
, а именно:
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;
}
Теперь я предполагаю, что если у меня есть Картинка
, которую я хочу сериализовать и куда-то отправить, я должен создать объект 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 должны быть уникальными). Я вижу, что мне приходится вручную создавать операторы переключения для перечислений, если вызов .name ()
из внутренней модели не соответствует имени перечисления, сгенерированному protobuf.
Думаю, мой вопрос в том, правильно ли я поступаю? Должен ли я отказаться от своей внутренней модели данных ( test.model.Picture
) в пользу модели, созданной protobuf ( test.model.protobuf.PictureProtoBuf
)? Если да, то как я могу реализовать некоторые тонкости, которые я сделал в моей внутренней модели данных (например, hashCode ()
, equals (Object)
, toString ()
и т. Д.)?