के साथ कार्य करना इस प्रकार मैं एक 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.
}
मैं अब protocol buffers का उपयोग कर इसे क्रमानुसार करने चाहते हैं। मैं एक Picture.proto फ़ाइल कि Picture
वर्ग के क्षेत्र दर्पण लिखा और PictureProtoBuf
की एक classname साथ test.model.protobuf
पैकेज के अंतर्गत कोड संकलित किया है:
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
है जब मैं अपने डाटा मॉडल में एक गणना है
Picture p = new Picture(100, 200, Picture.JPEG);
PictureProtoBuf.Picture.Builder output = PictureProtoBuf.Picture.newBuilder();
output.setHeight(p.getHeight());
output.setWidth(p.getWidth());
मैं unstuck आ रहा हूँ: मैं क्रमानुसार और कहीं मैं बहुत की तरह एक PictureProtoBuf
वस्तु बना सकते हैं और भर में सभी क्षेत्रों को मैप करने, राशि भेजना चाहते हैं। बदसूरत तरह से है कि मैं अभी उपयोग कर रहा हूँ है:
output.setFormat(PictureProtoBuf.Picture.Format.valueOf(p.getFormat().name());
हालांकि, इस टूटना का खतरा है और गणन नाम अपने आंतरिक डेटा मॉडल और प्रोटोकॉल बफ़र डेटा मॉडल के बीच लगातार किया जा रहा है पर निर्भर करता है (जो नहीं है .proto फ़ाइलों के भीतर गणना नाम के रूप में एक महान धारणा अद्वितीय होना चाहिए)। अगर मुझे आंतरिक मॉडल से .name()
कॉल प्रोटोबफ-जनरेटेड गणना नाम से मेल नहीं खाता है तो मैं गणनाओं पर हाथ-शिल्प स्विच स्टेटमेंट्स देख सकता हूं।
मुझे लगता है कि मेरा सवाल यह है कि क्या मैं इस बारे में सही तरीके से जा रहा हूं? क्या मुझे प्रोटोबफ-जेनरेटेड (test.model.protobuf.PictureProtoBuf
) के पक्ष में अपना आंतरिक डेटा मॉडल (test.model.Picture
) स्क्रैप करना है? यदि हां, तो मैं अपने आंतरिक डेटा मॉडल (उदाहरण के लिए hashCode()
, equals(Object)
, toString()
इत्यादि) में किए गए कुछ नब्बे के दशक को कैसे कार्यान्वित कर सकता हूं)?
मैंने कोशिश नहीं की है (पूरी तरह से जब से मैं मुख्य रूप से एक .NET व्यक्ति हूं), लेकिन मैं * विश्वास * [protostuff] (http://code.google.com/p/protostuff/) आपको अपने मौजूदा मॉडल के साथ काम करने की अनुमति देता है .. –
धन्यवाद, मैं इसे देख लूंगा! – Catchwa
@MarcGravell - आपके सुझाव के लिए धन्यवाद। आपका झुकाव सही था; protostuff ठीक है जो मैं बाद में था लेकिन बैक एंड पर प्रोटोकॉल बफर को बरकरार रखता है (हालांकि अभी तक Google प्रोटोबफ लाइब्रेरी के साथ इसकी संगतता का परीक्षण नहीं किया है)। – Catchwa