प्रोटोकॉल बफ़र्स में सीमांकित I/O फ़ंक्शंस: C समकक्ष
ऐसे परिदृश्यों में जहां एकाधिक प्रोटोकॉल बफ़र्स संदेश दोनों में फ़ाइलों से पढ़े या लिखे जाते हैं सी और जावा में, संदेशों में लंबाई उपसर्ग जोड़ना आवश्यक हो जाता है। जबकि जावा एपीआई इस उद्देश्य के लिए समर्पित "डीलिमिटेड" I/O फ़ंक्शन प्रदान करता है, C में उनके समकक्ष समकक्ष आसानी से स्पष्ट नहीं हो सकते हैं।
हालिया अद्यतन इंगित करता है कि ऐसे C समकक्ष अब google/protobuf/util में रहते हैं /delimited_message_util.h संस्करण 3.3.0 के भाग के रूप में। हालाँकि, इस अद्यतन से पहले, ऐसे वैकल्पिक कार्यान्वयन थे जो इस आवश्यकता को कुशलतापूर्वक संबोधित करते थे।
सी और जावा प्रोटोबफ़ लाइब्रेरीज़ के एक पूर्व लेखक द्वारा प्रदान किए गए ऐसे कार्यान्वयन में अनुकूलन शामिल हैं जो 64एमबी इनपुट के बाद संभावित विफलताओं को रोकते हैं। . ये कार्यान्वयन, जैसा कि नीचे दर्शाया गया है, व्यक्तिगत संदेशों पर 64एमबी की सीमा लागू करते हैं, यह सुनिश्चित करते हुए कि स्ट्रीमिंग समग्र सीमा को पार किए बिना निर्बाध रूप से जारी रहती है।
सी के लिए अनुकूलित सीमांकित I/O कार्यान्वयन
bool writeDelimitedTo(
const google::protobuf::MessageLite& message,
google::protobuf::io::ZeroCopyOutputStream* rawOutput) {
// Initialize a CodedOutputStream for each message.
google::protobuf::io::CodedOutputStream output(rawOutput);
// Determine the message size and write it as a Varint.
int size = message.ByteSize();
output.WriteVarint32(size);
// Optimize for messages fitting into a single buffer.
uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
if (buffer != NULL) message.SerializeWithCachedSizesToArray(buffer);
else message.SerializeWithCachedSizes(&output);
return true;
}
bool readDelimitedFrom(
google::protobuf::io::ZeroCopyInputStream* rawInput,
google::protobuf::MessageLite* message) {
// Initialize a CodedInputStream for each message.
google::protobuf::io::CodedInputStream input(rawInput);
// Read the message size.
uint32_t size;
if (!input.ReadVarint32(&size)) return false;
// Restrict reading to the determined message size.
google::protobuf::io::CodedInputStream::Limit limit =
input.PushLimit(size);
// Parse the message and verify it fits within the limit.
if (!message->MergeFromCodedStream(&input)) return false;
if (!input.ConsumedEntireMessage()) return false;
// Lift the reading restriction.
input.PopLimit(limit);
return true;
}
ये अनुकूलित कार्यान्वयन विभिन्न आकारों के संदेशों को प्रभावी ढंग से संभालते हैं और सी में सीमांकित I/O के लिए एक विश्वसनीय समाधान प्रदान करते हैं।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3