2009-04-29 12 views
11

मान लें कि मेरे पास एक फ़ाइल है जिसमें बाइनरीफॉमेटर द्वारा क्रमबद्ध ऑब्जेक्ट होता है। अब मैं उस मौजूदा फ़ाइल पर किसी अन्य ऑब्जेक्ट को क्रमबद्ध करने और इसे एपेंड करने में सक्षम होना चाहता हूं।मौजूदा फ़ाइल पर क्रमबद्ध करने के लिए कैसे?

मैं यह कैसे कर सकता हूं?

उत्तर

2

सबसे पहले, यदि आपको वास्तव में आवश्यकता है तो वस्तु की एक सरणी को स्टोर करना है - उन्हें एक कंटेनर में रखें और कंटेनर को क्रमबद्ध करें, जैसा कि पहले कहा गया था।

अब, अगर आप वास्तव में एक भी concatenated फ़ाइल में दो धारावाहिक वस्तु संग्रहीत करना चाहते हैं: मुझे यकीन है कि यह संभव है "बॉक्स से बाहर" नहीं कर रहा हूँ

, लेकिन आप दो बातें कर सकते हैं।

  1. का प्रयोग करें, या अपने खुद के अर्द्ध टार फ़ाइल स्वरूप है, जिसमें आप फ़ाइल है कि (फ़ाइल की सामग्री का वर्णन # 'वस्तुओं की शुरुआत में एक छोटी सी हैडर (या अंत) लिखेंगे आविष्कार, और आकार)।

  2. प्रत्येक धारावाहिक वस्तु की शुरुआत और अंत का पता लगाने के लिए एक सी # कोड लिखें। मुझे पूरा यकीन नहीं है कि यह संभव है। Here धारावाहिक प्रारूप का एक गैर-आधिकारिक दस्तावेज है। इसमें हेडर है, हालांकि इस बात की कोई गारंटी नहीं है कि यह हेडर फ़ाइल में दिखाई नहीं देगा।

2

कैसे, (उदाहरण के लिए सूची <YourObjectType>) इस

स्मृति में एक वस्तु में अपना पहला फ़ाइल की सामग्री Deserialise के बारे में है एक संग्रह करने के लिए पहली वस्तु जोड़ने के लिए, कि संग्रह के लिए अपने नए वस्तु जोड़ें, फिर संग्रह serialise (अब दो ऑब्जेक्ट्स हैं) मौजूदा फाइल के शीर्ष पर।

4

अपनी ऑब्जेक्ट्स को संग्रह ऑब्जेक्ट में रखें और उस तरह क्रमबद्ध करें। यदि आप किसी मौजूदा फ़ाइल के अंत में किसी ऑब्जेक्ट का बाइनरी प्रस्तुति जोड़ना चाहते हैं तो आपको इसे वापस पढ़ने में समस्याएं मिलेंगी।

+0

मुझे यकीन है कि मैंने अभी कहा है कि – tomfanning

+1

निश्चित रूप से वही है। याद दिलाएं कि एक साथ उत्तर लिखना संभव है और इसे अन्य उत्तरों को देखे बिना लगभग उसी समय पोस्ट करना संभव है। ;) – paweloque

+0

मुझे ऐसा लगता है :-) – tomfanning

3

असल में, यदि आप केवल लेखन के लिए स्ट्रीम खोलते हैं, और स्ट्रीम के अंत में पॉइंटर को पोजीशन करते हैं, तो आप किसी अन्य ऑब्जेक्ट को क्रमबद्ध कर सकते हैं और इसे मौजूदा स्ट्रीम में जोड़ा जाएगा।

Deserializing वस्तु को पिछले भी पढ़ा जाएगा, लेकिन आगे नहीं।

जाहिर है, आप अपने वस्तुओं (deserialize वस्तु एन.आर.। 17 नहीं, बल्कि यह पहले सब कुछ) करने के लिए रैंडम एक्सेस चाहते हैं, तो आप पदों जहां प्रत्येक वस्तु के शुरू होता है के एक सूचकांक की जरूरत है, लेकिन आप केवल सभी वस्तुओं पढ़ना चाहते हैं शुरुआत से, आप उन्हें एक दूसरे के बाद बस क्रमबद्ध कर सकते हैं।

+0

और आप इसे बाद में कैसे deserialize करेंगे? क्या आप निश्चित हैं। नेट हेडर से क्रमबद्ध ऑब्जेक्ट आकार जानता है? –

+0

यह एक बहुत अच्छा सवाल है। मैं इस पर बहुत ज्यादा शक है। –

+0

लेकिन हाँ, यह करता है। –

19

यह वास्तव में संभव है। नीचे दिया गया कोड वस्तु को जोड़ता है।

using (var fileStream = new FileStream("C:\file.dat", FileMode.Append)) 
{ 
    var bFormatter = new BinaryFormatter(); 
    bFormatter.Serialize(fileStream, objectToSerialize); 
} 

निम्नलिखित कोड वस्तुओं को de-serializes।

var list = new List<ObjectToSerialize>();  

using (var fileStream = new FileStream("C:\file.dat", FileMode.Open)) 
{ 
    var bFormatter = new BinaryFormatter(); 
    while (fileStream.Position != fileStream.Length) 
    { 
     list.Add((ObjectToSerialize)bFormatter.Deserialize(fileStream)); 
    } 
} 

फ़ाइल के लिए काम करने के लिए नोट केवल वही ऑब्जेक्ट्स होना चाहिए।

+0

क्या आपने इस कोड को आजमाया था? ऐसा लगता है कि यह केवल एक भाग को क्रमबद्ध करता है जिसे अंतिम रूप से जोड़ा गया था। यहां मेरा टेस्ट कोड है http://pastebin.com/EV4rPaT4 – mrgloom

+1

हाय mrgloom। यह लगभग 4 साल पुराना है लेकिन हां इसका उत्पादन किसी भी मुद्दे के साथ नहीं किया गया था। मैंने आपके टेस्ट कोड पर एक नज़र डाली है। आप 3 अलग-अलग सूचियों को क्रमबद्ध कर रहे हैं जो एक मौजूदा में शामिल नहीं हैं। जब आप deserialize आप प्रत्येक सूची वस्तु को नवीनतम के साथ ओवरराइड करते हैं। सूची में लाइन 22 को बदलने का प्रयास करें। AddRange ((सूची ) bFormatter.Deserialize (fileStream)); सौभाग्य। – Magpie

+0

धन्यवाद, यह बहुत अच्छा काम करता है! हालांकि मुझे नहीं पता क्यों:/bFormatter कैसे कर सकते हैं। फ़ाइल में ऑब्जेक्ट ToSerialize अंत कब पता है? डिबगिंग करते समय, fileStream.Position उस स्थिति पर ठीक से बंद हो जाता है जहां प्रत्येक ऑब्जेक्ट ToSerialize फ़ाइल में समाप्त होता है, और मैं यह नहीं समझ सकता कि क्यों ... – Loaderon

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

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