使用协议缓冲区和内部数据模型
我有一个现有的内部数据模型,如下所示: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 文件中的枚举名称需要是唯一的)。我可以看到,如果来自内部模型的调用与 protobuf 生成的枚举名称不匹配,我必须手动制作枚举上的 switch 语句。.name()
我想我的问题是我是否以正确的方式去做?我是否应该放弃我的内部数据模型()以支持原型buf生成的模型()?如果是这样,我如何实现我在内部数据模型中所做的一些细节(例如,,,等)?test.model.Picture
test.model.protobuf.PictureProtoBuf
hashCode()
equals(Object)
toString()