Laden...

Deserialisieren eines bestimmten Datensatzes in einer Binärdatei

Erstellt von getle87 vor 15 Jahren Letzter Beitrag vor 15 Jahren 799 Views
G
getle87 Themenstarter:in
36 Beiträge seit 2007
vor 15 Jahren
Deserialisieren eines bestimmten Datensatzes in einer Binärdatei

Hallo,

ich hätte mal eine Frage zum BinaryFormatter: Wenn ich Datensätze (mit mehreren Inhalten, wie z.B. Name, Alter, ...) serialisiere werden diese ja jeweils als ein Block in einer binären Form gespeichert und bilden damit ja eine Reihe von Blöcken in der gesamten Datei. Ich will jetzt einen bestimmten Datensatz wieder auslesen, mit Length und Position hab ich schon probiert, geht aber ne weil diese auf Bytelänge und ne auf kompletten Blöcken arbeiten, da jeder Datensatz je nach Inhalt unterschiedlich lang is, kann man die Länge eines Blockes auch nicht mit einem Rechenalgo überspringen um zur richtigen Pos im Stream zu kommen und wenn man die falsche Pos erreicht spuckt das Programm einen Fehler aus. Kann mir bitte jemand weiterhelfen ?

Da gibts es noch was zu sagen, da ich annehme, dass einige jetzt auf die Idee kommen werden mir XML anzubieten muss ich leider passen. Das Programm ist ein Projekt in meiner Ausbildung und mein Lehrer will nicht das wir XML oder rohes Textformat nehmen, er meinte es würde irgendwie gehen kam bis jetzt aber nicht richtig dazu mir die passenden Unterlagen zu geben.

630 Beiträge seit 2007
vor 15 Jahren

Hallo getle87,

nein das geht so nicht. Ich würde dir empfehlen die Datensätze in einem Array oder besser noch in einer List<Datensatz> zu speichern um dann die gesamte Liste in einem Rutsch zu deserialisieren. Wenn du Datensätze nach bestimmten Begriffen aussuchen willst könntest du auch eine Dictionary verwenden.

Gruss
tscherno

To understand recursion you must first understand recursion

http://www.ilja-neumann.com
C# Gruppe bei last.fm

G
getle87 Themenstarter:in
36 Beiträge seit 2007
vor 15 Jahren

Mir gehts eigentlich nur darum das ich ermitteln kann wieviele Datensätze existieren und mit Hilfe einer Zahl oder ID darauf zugreifen kann um sie zu bearbeiten oder auszulesen. Wo findet man was dazu bzw. weißt du wie das geht ?

S
341 Beiträge seit 2008
vor 15 Jahren

Servus getle87,

hat mal ein "ähnliches" problem...
es gibt mehrere varianten das problem zu lösen.

Allterdings gleich vorab du hast soweit ich weiß im binary format keine möglichkeit irgendwohin zu springen. wie tscherno schon gesagt hat.

eine möglichkeit ist das du wenn du die daten schreibst die zahl voranstellt wie lang der datensatz ist. somit kannst du deine datensätze beim wieder auslesen super in ein array schreiben.

allerdings ist tschernos variante mit array oder list<> auch gut.... wenn du wissen willst wieviele datensätze du hast kannst du die anzahl der datensetze VOR dem schreiben feststellen und mit deserialisieren.....
oder deine datensätze in einer list<> speicher, und wenn du sie deserialisierst kannst du dir ich glaub es ist list<>.Count die anzahl der einträge zurückgeben lassen.

einfach mal ausprobieren und im MSDN schaun 😉 steht auch alles drin

Grüße SMou

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}
G
getle87 Themenstarter:in
36 Beiträge seit 2007
vor 15 Jahren

Also mit dem MSDN komm ich ne so richtig klar weil das eher für Leute geschrieben is die wirklich was vom Programmieren verstehen, ich selbst sehe durch das ganze Fachchinesisch in der Hilfe ne so richtig durch, mit der List erstellen hat wenigstens schonmal geklappt, Problem is jetzt nur noch wie bekomme ich meine Variablenklasse dort rein, ich gehe mal von folgender Klasse aus:

irgendwo in einer eigenen cs - Datei steht:


[Serializable]
class CData
{
public string var1;
public string var2;
public int var3;
...
}

dann gehts ja im Hauptprogramm folgender Maßen weiter:


FileStream file = new FileStream(...);
BinaryFormatter stream = new BinaryFormatter;
CData filedata = new CData();
filedata.var1 = ...;
filedata.var2 = ...;
filedata.var3 = ...;
stream.Serialize(file,filedata);

so und wie bekomm ich dann meine einzelnen Daten der CData Klasse in die Liste ?
Ich weiß nur das der List Befehl folgender Maßen erstellt wird


List<Datentyp oder Klasse> Listenname = new List<Datentyp oder Klasse>;

und das es dort dann viele neue Befehle gibt.

S
341 Beiträge seit 2008
vor 15 Jahren

also

du must schreiben

List<CData> myList = new List<CData>;

Warum ? CData ist in dem Fall der Typ da du ja Klassenobjetct übergibts die alle vom Typ CData sind.

und dann myList.Add(myCData1) müsste es sein... einfach mal mit der intelliSense arbeiten... steht ja alles drin 😉

PS: Ich empfehl dir bezüglich solchen dingen... da sowas scho eher grundlage ist einfach mal ein hier 📗 oder hier http://www.galileocomputing.de/openbook/csharp/ reinzuschaun... ist alles super beschrieben 😉

Gruß

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}
G
getle87 Themenstarter:in
36 Beiträge seit 2007
vor 15 Jahren

Mit Add füge ich einen CData Datensatz hinzu wie ruf ich einen bestimmten wieder ab, ich finde den Befehl nicht ?

S
341 Beiträge seit 2008
vor 15 Jahren

Link to MSDN

http://msdn.microsoft.com/de-de/library/d9hw1as6.aspx

bitte streng dich ein bisl an wenn du etwas wissen möchtest

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}
G
getle87 Themenstarter:in
36 Beiträge seit 2007
vor 15 Jahren

hat sich erledigt müsste jetzt gehen, ich danke euch allen für die schnelle und unkomplizierte Hilfe !! 👍 🙂

S
341 Beiträge seit 2008
vor 15 Jahren

poste doch bitte noch deine lösung bzw wie du es jetzt gelöst hast.

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}