Tôi có một mô hình dữ liệu nội bộ hiện tại cho một Picture
, như sau:Làm việc với Nghị định thư Buffers và các mô hình dữ liệu nội bộ
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.
}
bây giờ tôi muốn serialize nó bằng cách sử protocol buffers. Tôi đã viết một tập tin Picture.proto phản ánh các lĩnh vực của lớp Picture
và biên soạn mã theo gói test.model.protobuf
với classname của 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;
}
Bây giờ tôi bây giờ giả định rằng nếu tôi có một Picture
rằng tôi muốn serialize và gửi ở đâu đó tôi có để tạo ra một đối tượng PictureProtoBuf
và bản đồ tất cả các lĩnh vực trên, như vậy:
Picture p = new Picture(100, 200, Picture.JPEG);
PictureProtoBuf.Picture.Builder output = PictureProtoBuf.Picture.newBuilder();
output.setHeight(p.getHeight());
output.setWidth(p.getWidth());
tôi đến lột khi tôi có một điều tra trong mô hình dữ liệu của tôi. Cách xấu xí mà tôi đang sử dụng ngay bây giờ là:
output.setFormat(PictureProtoBuf.Picture.Format.valueOf(p.getFormat().name());
Tuy nhiên, điều này là dễ bị vỡ và dựa vào tên liệt kê là nhất quán giữa các mô hình dữ liệu nội bộ của tôi và mô hình dữ liệu giao thức đệm (mà không phải là một giả định tuyệt vời là tên liệt kê trong tệp .proto cần phải là duy nhất). Tôi có thể thấy tôi phải báo cáo chuyển đổi thủ công trên danh sách nếu cuộc gọi .name()
từ mô hình nội bộ không khớp với tên điều tra được tạo bởi protobuf.
Tôi đoán câu hỏi của mình là liệu tôi có đi đúng hướng không? Tôi có phải loại bỏ mô hình dữ liệu nội bộ của mình (test.model.Picture
) có lợi cho mô hình dữ liệu được tạo bởi protobuf (test.model.protobuf.PictureProtoBuf
) không? Nếu có, làm cách nào để tôi có thể triển khai một số tính năng mà tôi đã thực hiện trong mô hình dữ liệu nội bộ của mình (ví dụ: hashCode()
, equals(Object)
, toString()
, v.v ...)?
Tôi chưa thử nó (hoàn toàn là vì tôi chủ yếu là người .NET), nhưng tôi * tin * [người bảo vệ] (http://code.google.com/p/protostuff/) cho phép bạn tiếp tục làm việc với mô hình hiện tại của mình .. –
Cảm ơn, tôi sẽ kiểm tra! – Catchwa
@MarcGravell - Cảm ơn bạn đã đề xuất. Linh cảm của bạn là chính xác; protostuff thực hiện chính xác những gì tôi đã làm sau nhưng vẫn giữ lại các bộ đệm giao thức trên back-end (chưa thử nghiệm khả năng tương thích với thư viện protobuf của Google). – Catchwa