2013-05-07 11 views
5

Tworzę bibliotekę do rejestrowania błędów, która tworzy plik w określonej lokalizacji, a następnie zapisuje informacje o błędzie w tym pliku, które mogą być następnie odczytywane przez osobny program, który zamierzam napisać w połączeniu z tą biblioteką.Serializacja i Deserializacja wielu obiektów

Sposób, że jestem zapisując go w formacie binarnym (przy użyciu BinaryFormatter() i FileStream()), gdzie i serializowania klasy o nazwie ErrorEntry do pliku i dołączyć go do końca pliku. Oznacza to, że mam serię ErrorEntries z powrotem do tyłu. Nie mam go jako listy, ponieważ nie wydaje mi się, że trzeba przeczytać wszystkie informacje na liście z pliku, dodać wpis, a następnie zapisać go z powrotem w pliku i zrzucić zasoby. Wydaje się znacznie skuteczniejsze, aby wykonać tylko jedno polecenie zapisu, a po prostu przechowywać każdy jako swój własny obiekt, który jest serializowany.

Moim problemem jest to, że mogę znaleźć kilka przykładów na serializowanie list lub pojedynczych obiektów, ale nic na wielu - ale osobnych - obiektach. Chociaż chcę zapisać je jako pojedyncze obiekty, po ich załadowaniu chcę odczytać obiekt i zwrócić serię jako listę tego obiektu. Wyobrażam sobie, że jest coś podobnego do Jak mam zamiar deserializować każdy obiekt z jednego pliku? Czy ma wewnętrzny znacznik, który działa powyżej i po prostu muszę wykryć, czy to koniec pliku, czy też muszę zrobić coś innego, aby je przeczytać?

+0

Dlaczego nie można po prostu umieścić wszystkie te obiekty do listy '' i szeregować tej struktury danych? Zapobiegniesz wielu narożnym przypadkom, takim jak współzależności między obiektami uważanymi za "oddzielne". –

+0

@OndrejTucny chce dołączyć do pliku bez ładowania wszystkich poprzednich wpisów. – weston

+0

Powiedział, dlaczego i wygląda na rozsądne. Aby deserializować na poziomie obiektu, musisz napisać sekwencję separatora po każdym wpisie i reagować na nią po przeczytaniu pliku z powrotem. – Tommi

Odpowiedz

6

Dzięki FileStream fs; można wykonać fs.Position!=fs.Length, aby wykryć EOF.

Podczas dołączania użyj FileMode.Append lub fs.Seek(0, SeekOrigin.End);, aby przejść do końca przed zapisaniem nowego wpisu.

deserializacji w całości:

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

Co powiesz na deserializację obiektów z tego pliku? Fakt, że możesz serializować wiele obiektów do pliku przy użyciu append, nie gwarantuje, że będziesz w stanie przekształcić je z powrotem. – Artemix

+0

@Artemix patrz edycja. Na podstawie jego kodu. Czy coś jest z tym nie tak? – weston

+0

nie tylko przy użyciu pliku filemode.append, a następnie pisania pracy? czy muszę powiedzieć filemode.append i fs.seek? –