2015-03-12 4 views
17

मैं जावा में Google प्रोटोबफ के साथ काम कर रहा हूं। मैं देख रहा हूँ कि यह स्ट्रिंग के लिए एक Protobuf संदेश, बाइट [], ByteString, आदि को क्रमानुसार करने के लिए संभव है: (स्रोत: https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/MessageLite)Google प्रोटोबफ बाइटस्ट्रिंग बनाम बाइट []

मैं नहीं जानता कि क्या एक ByteString है। मुझे प्रोटोबफ एपीआई दस्तावेज (स्रोत: https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/ByteString) से निम्नलिखित परिभाषा मिली है: "बाइट्स का अपरिवर्तनीय अनुक्रम। स्ट्रिंग के साथ अपरिवर्तनीय अंतर्निहित बाइट्स के संदर्भ को साझा करके सबस्ट्रिंग को समर्थित किया जाता है।"

यह मुझे स्पष्ट नहीं है कि बाइटस्ट्रिंग स्ट्रिंग या बाइट [] से अलग कैसे है। क्या कोई कृपया समझा सकता है? धन्यवाद।

उत्तर

23

आप ByteString को एक अपरिवर्तनीय बाइट सरणी के रूप में सोच सकते हैं। तो इतना ही है। यह byte[] है जिसका उपयोग आप प्रोटोबफ में कर सकते हैं। Protobuf आपको जावा सरणी का उपयोग नहीं करने देता है क्योंकि वे उत्परिवर्तनीय हैं।

ByteString मौजूद है क्योंकि String बाइट्स के मनमाना अनुक्रमों का प्रतिनिधित्व करने के लिए उपयुक्त नहीं है। String विशेष रूप से चरित्र डेटा के लिए है।

प्रोटोबफ मेसेजलाइट इंटरफेस ByteArray() और toyyString() विधियों को प्रदान करता है। यदि बाइटस्ट्रिंग एक अपरिवर्तनीय बाइट [] है, तो बाइटस्ट्रिंग और बाइट दोनों द्वारा प्रतिनिधित्व किए गए संदेश का बाइट प्रतिनिधित्व वही होगा?

क्रमबद्ध करें। यदि आप toByteArray() पर कॉल करते हैं तो आपको वही मान मिलेगा जैसे आप toByteString().toByteArray() पर कॉल करना चाहते थे। दो विधियों के कार्यान्वयन की तुलना करें, AbstractMessageLite में:

public ByteString toByteString() { 
    try { 
    final ByteString.CodedBuilder out = 
     ByteString.newCodedBuilder(getSerializedSize()); 
    writeTo(out.getCodedOutput()); 
    return out.build(); 
    } catch (IOException e) { 
    throw new RuntimeException(
     "Serializing to a ByteString threw an IOException (should " + 
     "never happen).", e); 
    } 
} 

public byte[] toByteArray() { 
    try { 
    final byte[] result = new byte[getSerializedSize()]; 
    final CodedOutputStream output = CodedOutputStream.newInstance(result); 
    writeTo(output); 
    output.checkNoSpaceLeft(); 
    return result; 
    } catch (IOException e) { 
    throw new RuntimeException(
     "Serializing to a byte array threw an IOException " + 
     "(should never happen).", e); 
    } 
} 
+0

protobuf MessageLite इंटरफ़ेस ByteArray() और toByteString() विधियों को प्रदान करता है। यदि बाइटस्ट्रिंग एक अपरिवर्तनीय बाइट [] है, तो बाइटस्ट्रिंग और बाइट दोनों द्वारा प्रतिनिधित्व किए गए संदेश का बाइट प्रतिनिधित्व वही होगा? –

+0

@RahimPirbhai मेरा संपादन देखें। –

2

एक ByteString आप एक नया संरचना में डेटा की प्रतिलिपि के बिना अंतर्निहित डेटा के बारे में अधिक कार्रवाई करने की क्षमता देता है। उदाहरण के लिए, यदि आप किसी अन्य विधि में byte[] में bytes का उप-समूह प्रदान करना चाहते हैं, तो आपको इसे प्रारंभ सूचकांक और अंत अनुक्रमणिका के साथ आपूर्ति करने की आवश्यकता होगी। आप नई डेटा संरचना बनाने और डेटा को मैन्युअल रूप से कॉपी किए बिना ByteStrings को भी संयोजित कर सकते हैं।

हालांकि, ByteString के साथ आप अंतर्निहित भंडारण के बारे में कुछ भी जानने के तरीके के बिना विधि को उस डेटा का सबसेट दे सकते हैं। एक सामान्य स्ट्रिंग के एक सबस्ट्रिंग की तरह।

एक स्ट्रिंग पाठ का प्रतिनिधित्व करने के लिए है और नहीं बाइनरी डेटा स्टोर करने के लिए एक अच्छा तरीका है (सभी नहीं बाइनरी डेटा एक टेक्स्ट बराबर जब तक आप एक तरह से कि करता है में यह सांकेतिक शब्दों में बदलना है के रूप में: जैसे हेक्स या Base64)।

संबंधित मुद्दे