2010-07-15 12 views
5

मुझे निम्न समस्या का सामना करना पड़ रहा है। मुझे (डी) डिस्क पर एक फ़ाइल में ऑब्जेक्ट्स की धारा धारावाहिक (बाइनरी) की आवश्यकता है। सीरियलाइजेशन हिस्सा कोई मुद्दा नहीं है, बस एपेंड मोड में एक स्ट्रीम खोलें और नेट की बाइनरीफॉर्मेटर सीरियलाइज विधि का उपयोग करें और आप कर चुके हैं। इस दृष्टिकोण के साथ समस्या यह है कि मैं इस स्ट्रीम को बाइनरीफॉर्मेटर के deserialize फ़ंक्शन को नहीं दे सकता, इसमें जो वस्तु है, वह उस ऑब्जेक्ट का एक उदाहरण नहीं है जिसे मैंने क्रमबद्ध किया है।बाइनरी (डी) ऑब्जेक्ट्स की एक धारा का सीरियलाइजेशन 1 फ़ाइल

क्या इस समस्या का एक आम समाधान मौजूद है? किसी दिए गए स्ट्रीम में क्रमबद्ध सभी ऑब्जेक्ट्स एक ही प्रकार के होते हैं, इसलिए कम से कम हमें यह पता लगाने की आवश्यकता नहीं होती कि क्या deserialized किया जाना है, यह एक दिया गया है, लेकिन ऐसा लगता है कि यह मेरे लिए एक तरीका सुझाता है।

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

  • आम तौर पर जब आप एक वस्तु को क्रमानुसार आपको लगता है कि होता है एक फ़ाइल प्राप्त करें:

[वस्तु]

  • क्या मैं बनाने रहा एक फ़ाइल है कि है:

[ऑब्जेक्ट] [ऑब्जेक्ट] [ऑब्जेक्ट] [ऑब्जेक्ट] ... [ऑब्जेक्ट]

और मुझे व्यक्तिगत ऑब्जेक्ट उदाहरणों को deserialize करने की जरूरत है।

अग्रिम धन्यवाद!

उत्तर: के बाद से इस सवाल का जवाब (पर्याप्त स्पष्टता के साथ) इस सूत्र में alluded है, लेकिन स्पष्ट रूप से कहा कभी नहीं, मैंने सोचा कि मैं इसे यहाँ राज्य होगी:

while (fileStream.Position < fileStream.Length) 
    messages.Add((Message)formatter.Deserialize(fileStream)); 

BinaryFormatter एक वस्तु deserialize होगा वांछित समय पर :) आप fileStream.Length गुण को कैश करना चाहते हैं, क्योंकि प्रत्येक बार जब आप संपत्ति को कॉल करते हैं, तो चीजों को धीमा कर देते समय लंबाई की गणना की जाती है। मुझे कोई सुराग नहीं मिला है कि इस सवाल को पोस्ट करने से पहले मैंने पहली बार ऐसा क्यों नहीं किया था, लेकिन यह अब बेकार ढंग से काम करता है।

उत्तर

1

, एक serializable संग्रह में अपनी वस्तुओं डाल (मेरा मानना ​​है कि सूची serializable है) तो (डी) स्पष्टीकरण के जवाब में serializing कि वस्तु

संपादित करें का प्रयास करें: मैं सिर्फ महसूस किया कि यह सवाल एक ही जवाब है कि इस question के रूप में। के बजाय कोशिश करते हैं और एक जवाब एक नए अंदाज़ में, मैं सिर्फ मार्क Gravell के जवाब पर एक नज़र डालें चाहते हैं या this one

+0

ऑब्जेक्ट सिस्टम के जीवनकाल के दौरान स्ट्रीम किए जाते हैं और उनमें से बहुत बड़ी संख्या में अपेक्षित है , मुझे फ्लश करने की जरूरत है।उन्हें रैपर-संग्रह में रखने के साथ मुझे उन्हें स्मृति में रखना होगा और हर बार जब मैं डिस्क पर फ्लश करना चाहता हूं तो पूरी फ़ाइल को फिर से लिखना होगा। – United

+0

पहला सुझाव किसी अन्य लाइब्रेरी की आवश्यकता के कारण काम नहीं करता है (अगर मैं भाग्यशाली हूं तो कानूनी रूप से उर्फ ​​6 माह + अनुमोदन प्रक्रिया)। दूसरा एक दिलचस्प है। दूसरे जवाब के लिए, ऐसा प्रतीत होता है कि उन्हें ऑब्जेक्ट्स की श्रृंखला को एक फ़ाइल से संग्रहित करने के लिए सामान्य क्रमबद्धता प्राप्त हुई है, बिना उन वस्तुओं के संग्रह में। मेरे परीक्षणों में जो काम नहीं करते थे, इसलिए मुझे लगता है कि मैं इसे और अधिक देखने की कोशिश करूंगा + शायद उस SO प्रश्न में अनुवर्ती हो। – United

0

एक फ़ाइल एक क्रमबद्धता है, तो मैं एक फ़ाइल के लिए सीधे अपनी स्ट्रीम भेजने आप क्या करेंगे लगता होगा प्रतीत होता है एक और उपयोगी उत्तर प्रदान करने के लिए, आपकी स्थिति का एक और विशिष्ट स्पष्टीकरण मदद करेगा। (काश मैं इसे 'टिप्पणी' के रूप में दर्ज कर सकता हूं, लेकिन किसी भी तरह टिप्पणी बटन मेरे लिए उपलब्ध नहीं है।)

+0

सीरियलाइजेशन समस्या नहीं है। समस्या यह है कि यदि मैं एक समय में एक वस्तु को क्रमबद्ध करता हूं (जो मुझे चाहिए) और उन्हें एक स्ट्रीम में जोड़ना है, तो मैं परिणामी धारा को deserialize नहीं कर सकता, क्योंकि पूरी धारा एक वस्तु का प्रतिनिधित्व नहीं करता है। – United

+0

असल में, आमतौर पर जब आप किसी ऑब्जेक्ट को किसी फ़ाइल पर क्रमबद्ध करते हैं, तो फ़ाइल में उस ऑब्जेक्ट (यानी [ऑब्जेक्ट]) होगा ताकि आप ऑब्जेक्ट obj = binaryFormatter.Deserialize (fs, MyObjType) को deserialize कर सकें; मेरे पास फॉर्म [ऑब्जेक्ट] [ऑब्जेक्ट] ... [ऑब्जेक्ट] की फाइल है इसलिए मैं इस फ़ाइल पर deserialize फ़ंक्शन को कॉल नहीं कर सकता, क्योंकि मैंने जो deserializer प्रदान किया है वह एक ऑब्जेक्ट का क्रमिकरण नहीं है। – United

+0

मैं जो सोच रहा था उसे कुछ डिलीमीटरों में रखा गया है (बशर्ते वहां प्रतीकों का संयोजन मौजूद हो जो एक धारावाहिक कभी उत्पादन नहीं कर सकता)। इस तरह से मैं एक स्ट्रीम में फ़ाइल को मैन्युअल रूप से पार्स (सिंगल सीरियलाइज्ड ऑब्जेक्ट का प्रतिनिधित्व करने) में पार्स कर सकता हूं और दूसरी स्ट्रीम में भाग देता हूं, जो बदले में deserializer को दिया जाता है। – United

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