2013-05-07 6 views
5

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

जिस तरह से मैं इसे सहेज रहा हूं वह बाइनरी प्रारूप में है (BinaryFormatter() और FileStream() का उपयोग करके), जहां मैं फ़ाइल में ErrorEntry नामक एक वर्ग को क्रमबद्ध करता हूं और इसे फ़ाइल के अंत में जोड़ता हूं। इसका मतलब यह है कि मेरे पास वापस एररएन्ट्रीज़ की एक श्रृंखला है। मेरे पास यह एक सूची के रूप में नहीं है क्योंकि यह फ़ाइल से किसी सूची में सभी जानकारी को पढ़ने के लिए प्रैक्टिकल प्रतीत नहीं होता है, एक प्रविष्टि जोड़ें, फिर इसे फ़ाइल में वापस सहेजें और संसाधनों को डंप करें। यह केवल एक ही लिखने के आदेश को करने के लिए और अधिक प्रभावी लगता है, और केवल प्रत्येक को अपनी ऑब्जेक्ट के रूप में स्टोर करें जो क्रमबद्ध है।

मेरी समस्या यह है कि मैं सूचियों या व्यक्तिगत वस्तुओं को क्रमबद्ध करने पर कई उदाहरण पा सकते हैं, लेकिन एकाधिक - लेकिन अलग-अलग वस्तुओं पर कुछ भी नहीं। हालांकि मैं उन्हें अलग-अलग ऑब्जेक्ट्स के रूप में सहेजना चाहता हूं, जब मैं उन्हें लोड करता हूं तो मैं ऑब्जेक्ट को पढ़ना चाहता हूं और श्रृंखला को उस ऑब्जेक्ट की सूची के रूप में वापस करना चाहता हूं। मैं कल्पना

while(!EOF) 
{ 
    //deserialize each object 
    //add individual object to a list 
} 
//return the list of objects 

मैं कैसे किसी एक फ़ाइल से प्रत्येक वस्तु deserializing के बारे में जाना होगा करने के लिए कुछ इसी तरह है कि वहाँ? क्या इसमें एक आंतरिक मार्कर है जो उपर्युक्त काम करता है और मुझे बस यह पता लगाने की आवश्यकता है कि यह फ़ाइल का अंत है या नहीं, या मुझे उन्हें पढ़ने के लिए कुछ और करने की ज़रूरत है?

+0

आप क्यों नहीं बस एक 'सूची 'में उन सभी वस्तुओं को रखा और कहा कि डेटा संरचना को क्रमानुसार नहीं है? आप कई अलग-अलग कोने मामलों को रोक देंगे जैसे ऑब्जेक्ट्स के बीच परस्पर निर्भरता 'अलग' माना जाता है। –

+0

@OndrejTucny वह सभी पिछली प्रविष्टियों को लोड किए बिना फ़ाइल में जोड़ना चाहता है। – weston

+0

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

उत्तर

6

FileStream fs; के साथ आप ईओएफ का पता लगाने के लिए fs.Position!=fs.Length कर सकते हैं।

संलग्न करते समय, नई प्रविष्टि लिखने से पहले अंत में जाने के लिए FileMode.Append या fs.Seek(0, SeekOrigin.End); का उपयोग करें।

पूर्ण में deserializing:

public static ICollection<T> DeserializeList<T>(FileStream fs) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    List<T> list = new List<T>(); 
    while(fs.Position!=fs.Length) 
    { 
     //deserialize each object in the file 
     var deserialized = (T)bf.Deserialize(fs); 
     //add individual object to a list 
     list.Add(deserialized); 
    } 
    //return the list of objects 
    return list; 
} 
+1

इस फ़ाइल से वस्तुओं को deserializing के बारे में क्या? तथ्य यह है कि आप एपेंड का उपयोग करके फ़ाइल में कई ऑब्जेक्ट्स को क्रमबद्ध कर सकते हैं, यह गारंटी नहीं देता है कि आप उन्हें वापस deserialize करने में सक्षम होंगे। – Artemix

+0

@Artemix संपादित देखें। प्रश्न में उनके कोड के आधार पर। उस के साथ कुछ गलत है? – weston

+0

सिर्फ filemode.append का उपयोग नहीं करेगा और फिर काम लिख रहा है? या मुझे filemode.append और fs.seek कहना है? –

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