Работа с буферами протокола и внутренними моделями данных

У меня есть существующая внутренняя модель данных для изображения , а именно:

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 () и т. Д.)?

15
задан Catchwa 14 February 2012 в 06:26
поделиться