2010-03-14 13 views
7

के साथ वर्तमान स्ट्रीम स्थिति पर एक प्रकार का Deserializing मैं कई वस्तुओं को एक स्ट्रीम में क्रमबद्ध कर रहा हूं, लेकिन जब मैं उन्हें वापस पढ़ने की कोशिश करता हूं, तो मुझे अंतिम वस्तु के अलावा कुछ भी नहीं मिल रहा है:प्रोटोबफ-नेट

ProtoBuf.Serializer.Serialize(stream, postA1); 
ProtoBuf.Serializer.Serialize(stream, postB1); 
stream.Position = 0; 
var postA2 = ProtoBuf.Serializer.Deserialize<Post>(stream); 
var postB2 = ProtoBuf.Serializer.Deserialize<Post>(stream); 

पहला deserialize स्ट्रीम को अंत तक ले जाता है और पोस्टए 2 में पोस्ट बी 1 का मान होता है, जबकि पोस्टबी 2 केवल एक अनियमित उदाहरण है। क्या यह अपेक्षित व्यवहार है, और यदि हां, तो आप किसी ऑब्जेक्ट को किसी स्ट्रीम में यादृच्छिक स्थिति से कैसे deserialize करते हैं?

उत्तर

8

डिफ़ॉल्ट, Protobuf तक (गूगल कल्पना, नहीं proobuf शुद्ध विशेष रूप से) आप एक ही वस्तु के हिस्से के रूप में लगातार संदेशों के इलाज के लिए अनुमति देने के लिए बनाया गया है - यानी आप बस श्रृंखलाबद्ध, द्वारा संदेश के लिए फ़ील्ड जोड़ सकते हैं जो अनिवार्य रूप से आप यहां क्या कर रहे हैं। प्रत्येक शीर्ष-स्तरीय ऑब्जेक्ट (डिफ़ॉल्ट रूप से) किसी भी अगली ऑब्जेक्ट से अलग होने का प्रकार नहीं है।

यह उनके रूप में विभिन्न वस्तुओं के इलाज के लिए पाने के लिए, *WithLengthPrefix तरीकों को देखो (या आप IEnumerable<T> संस्करणों का उपयोग कर सकते हैं - शायद DeserializeItems, यह भी ध्यान दें कि यह लंबाई उपसर्गों स्वचालित रूप से लागू होगी अगर आप इसे क्रमानुसार करने एक सूची की तरह कुछ देना);

मूलतः:: उदाहरण के लिए

Serializer.SerializeWithLengthPrefix(stream, postA1, PrefixStyle.Base128, 1); 
Serializer.SerializeWithLengthPrefix(stream, postB1, PrefixStyle.Base128, 1); 
stream.Position = 0; 
var postA2 = Serializer.DeserializeWithLengthPrefix<Post>(stream, 
    PrefixStyle.Base128, 1); 
var postB2 = Serializer.DeserializeWithLengthPrefix<Post>(stream, 
    PrefixStyle.Base128, 1); 
+0

मैं वास्तव में क्या देख रहा था। मुझे यह नहीं मिला कि DeserializeWithLengthPrefix इसे देखने से क्या किया था। धन्यवाद –

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

  • कोई संबंधित समस्या नहीं^_^