2013-05-07 15 views
5

Belirtilen bir konumda bir dosya oluşturan bir hata günlüğü kitaplığı yapıyorum, daha sonra bu dosyadaki hata bilgilerini kaydeder, sonra da birlikte yazmayı planladığım ayrı bir tasker programı tarafından okunabilir bu kütüphane ile.Birden Çok Nesneyi Serileştirme ve Serpiştirme

Kaydetme biçimim, İkili Biçim (BinaryFormatter() ve FileStream() kullanarak) içinde dosyaya ErrorEntry adlı bir sınıfı serileştirir ve dosyanın sonuna ekler. Bunun anlamı, bir dizi ErrorEntries’imin arka arkaya olması. Listeye sahip değilim çünkü tüm bilgileri dosyadan bir listeye okumak, bir giriş eklemek, daha sonra dosyaya geri kaydetmek ve kaynakları dökmek pratik değil. Sadece tek bir yazma komutu yapmak için çok daha etkili görünüyor ve her birini serileştirilmiş kendi nesnesi olarak sakla.

Sorunum, seri hale getirme listeleri veya tekil nesneler üzerinde birkaç örnek bulabildiğim, ancak çoklu - ancak ayrı - nesneler üzerinde hiçbir şey bulunamamasıdır. Bunları tek tek nesneler olarak kaydetmek istiyorum, ancak onları yüklediğimde, nesneyi okumak ve seriyi bu nesnenin bir listesi olarak döndürmek istiyorum. Sanırım her bir nesneyi tek bir dosyadan silmeye nasıl geçebilirim? Yukarıdaki çalışmaların ve sadece dosyanın sonu olup olmadığını algılamaya ihtiyaç duyduğumu veya bunları okumak için başka bir şey yapmam gerektiğini belirten dahili bir işaretleyici var mı?

+0

Neden sadece bir 'Listesine ' içine tüm bu nesneleri koymak ve bu veri yapısını serileştirmez mı? 'Ayrı' olduğu düşünülen nesneler arasındaki karşılıklı bağımlılıklar gibi birçok köşe durumunu önleyeceksiniz. –

+0

@OndrejTucny, önceki tüm girişleri yüklemeden dosyaya eklemek istiyor. – weston

+0

Neden olduğunu ve makul göründüğünü söyledi. Nesne seviyesinde serileştirmek için, her girişten sonra sınırlayıcı sıralamayı yazmalı ve dosyayı geri okuduğunuzda buna tepki vermelisiniz. – Tommi

cevap

6

FileStream fs; ile EOF'yi algılamak için fs.Position!=fs.Length yapabilirsiniz.

Ekleme yaparken, yeni girdiyi yazmadan önce sonuna kadar gitmek için FileMode.Append veya fs.Seek(0, SeekOrigin.End); kullanın. tam olarak

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

Nesnelerin bu dosyadan geri serileştirilmesine ne dersiniz? Eklemi kullanarak dosyaya birçok nesneyi serileştirebildiğiniz gerçeği, bunları geri gönderebilmenizi garanti etmez. – Artemix

+0

@Artemix bkz. Düzenle. Söz konusu koduna dayanarak. Bununla ilgili yanlış bir şey var mı? – weston

+0

sadece filemode.append kullanıyor ve sonra yazı yazmıyor mu? veya filemode.append ve fs.seek demek zorunda mıyım? –

İlgili konular