2011-12-22 4 views
11

यह विधि अंतिम तर्क के रूप में एक पूर्णांक के रूप में स्वीकार करती है, लेकिन मुझे यकीन नहीं है कि मैं समझता हूं कि मैं इसका उपयोग किस प्रकार करूँगा।protobuf-net SerializeWithLengthPrefix टैग तर्क क्या है?

Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]); 

वही संबंधित deserialize विधि के लिए भी सच है।

क्या यह अवांछित संदेशों को फ़िल्टर करने के लिए deserialization पर कुछ प्रकार की "क्वेरीिंग" क्षमताओं को जोड़ने के लिए संदेशों को टैग करने का एक तरीका है या क्या इसका कोई अन्य उपयोग है?

उत्तर

9

असल में, यह एक अतिरिक्त मार्कर कि हो सकता है (हालांकि होने के लिए नहीं है) संदेश के "प्रकार" नोट करने के लिए जोड़ा जा रहा है, अनुमान के बाद से (जब *WithLengthPrefix दृष्टिकोण का उपयोग कर) का इस्तेमाल किया है कि वहाँ है एक ही स्ट्रीम में कई संदेश हैं।

तक शामिल किया जा रहा है, यह भी मतलब है कि पूरे समग्र धारा ही एक पूरी तरह से वैध Protobuf संदेश है।

इस का उपयोग करने के तरीके:

  • आप एक List<Foo> को क्रमानुसार कर सकते हैं, और फिर बार-बार वस्तुओं की एक विषम सेट के साथ (साथ-लंबाई-उपसर्ग) व्यक्तिगत Foo आइटम, या इसके विपरीत
  • deserialize, आप Serializer.NonGeneric एपीआई का उपयोग टैग के आधार पर प्रकार-रिज़ॉल्यूशन की अनुमति देने के लिए कर सकते हैं, यानी "अगर 1 फिर चालान; यदि 2 फिर ऑर्डर करें, तो 3 अगर उसे छोड़ दें, तो 4 तो ग्राहक", आदि - यह विशेष रूप से उपयोगी है यदि संदेश भेजने वाले डिवाइस के रूप में NetworkStream का उपयोग करना है। यह दृष्टिकोण (प्रकार प्रति एक अलग टैग का प्रयोग करके) आप धारा बंद वस्तुओं पढ़ा है, और उन्हें सही ढंग से deserialize, अगले संदेश के अग्रिम में जानने प्रकार बिना करने की अनुमति देता

यह अगर आप इस को छोड़ देते हैं के लिए संभव है चाहते हैं - बस शून्य पास करें (आईआईआरसी)। यह (आमतौर पर) प्रति संदेश एक बाइट बचाएगा, लेकिन: इसका मतलब है कि स्ट्रीम अब एक वैध प्रोटोबफ नहीं है। पढ़ते समय शून्य से गुजरकर, यह अभी भी पढ़ा जा सकता है।

+1

टैग सहित यह एक वैध प्रोटोबफ संदेश क्यों बनाता है? क्या आप टैग के बिना सूची में अलग-अलग आइटम को deserialize नहीं कर सकते? – Simone

+0

इसके अलावा, टैग कोड का उपयोग कर रिज़ॉल्यूशन टाइप करें, एप्लिकेशन कोड द्वारा किया जाना चाहिए, है ना? – Simone

+1

@ सिमोन यह * समग्र * संदेश को एक वैध प्रोटोबफ बनाता है, क्योंकि 'दोहराया गया संदेश टाइप' (.proto) "[टैग] [लंबाई] [पेलोड] ... [टैग] [लंबाई] के अनुक्रम के रूप में एन्कोड किया गया है [ पेलोड] "। इसलिए टैग के साथ यह एक वैध प्रोटोबफ है, और बिना: यह नहीं है। फिर संकल्प टाइप करें; आम तौर पर हां, क्योंकि यह जानबूझकर मंच स्वतंत्र है; हालांकि, प्रोटोबफ-नेट में वायर पर कुछ सीमित प्रकार की जानकारी शामिल करने के लिए कुछ * अतिरिक्त * समर्थन भी शामिल है। –

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