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