Serialisierung
-
Ich möchte Objekte welche eine eindeutige Id haben Speichern. Soweit noch kein Problem. Das Problem kommte dabei auf, wenn ich beim laden einen speziellen Key suchen möchte, bzw nur diesen Datensatz updaten möchte. Ich denke das wird wieder schwieriger. Gibts dafür ansätze?
Laden wäre wohl das wenigste, ich könnte mir ein Objekt laden, schauen ob die ID Stimmt und je nachdem das nächste Laden bis ich ggf das ende erreicht habe. Wenn ich am Anfang der Datei die Anzahl der Datensätze schreibe gibts da wohl kein problem.
Problematischer ist ein Speichern bzw Updaten. Dafür müsste ich wohl schauen ob dieser Key schonmal exisitert. Habe ich einen passenden Datensatz gefunden (Und hier? Ab hier müsste ich wohl alles neu speichern denn entfernen bzw updaten des Datensatzes geht auch nicht). Wenn ich am Ende angekommen bin heißt das der Datensatz existiert nicht und ich muss ihn neu anfügen.
Eine Alternative wäre ein XML Format in dem ich den Keys die Objekte zuordne. Ich parse zu einen Key... schaue ob der Stimmt und kann diesen bearbeiten, löschen etc. Die Frage ist nur: Kann ich im XML dann binärdaten speichern?
-
Ich merk schon, ich muss irgendwann mal alles laden. Und ggf alles was ich nicht brauche vergessen. Obwohl mir die Lösung gar nicht recht schmecken mag.
-
Die Frage ist nur: Kann ich im XML dann binärdaten speichern?
Speicher doch direkt alles im Binärformat. .NET hat auch einen sehr guten BinaryFormater womit du ganze Objekte Binär speicher und laden kannst.
-
Mein Grundgedanke war eigentlich nur das benötigte Zu laden bzw zu Speichern, ohne alle Daten in den Speicher zu nehmen. Leider geht das nicht so wie ich mir dachte. Daher komme ich da wohl nicht drumrum alles in den Ram zu laden. Dann ist natürlich der binaryformatter die bessere wahl.
-
Du könntest deiner Datei am Anfang einen Index hinzufügen der die verfügbaren Keys enthält. Der Index könnte dann noch erweitert werden um Startposition/Länge eines Objektes in der Datei (byte offset). Das Serialisieren der einzelnen Objekte kannst du ja immer noch mit einem Serialisierer vornehmen. Das Aktualisieren einer solchen Datei, bei dem nicht alle Objekte im Arbeitsspeicher sind, würde dann aber aufwändig werden. Vllt wäre ein filebasiertes Dateisystem wie sqllite was für dich.
-
Das Problem ist, dass ich nichts weiter in die Hand bekommen kann ausser 1-n Streams. Dabei kann es sogar sein das ich die Streams nichtmal Dynamisch anlegen darf (Das n darf ich also nicht dynamisch erweitern sondern muss ich schon jetzt festlegen). Das ganze liegt am Framework und Beschränkungen des Auftraggebers.
-
Worin liegt das Problem gleich alles zu laden? Kommst du etwa an 1GB Ram?
-
Fedaykin schrieb:
Kann ich im XML dann binärdaten speichern?
Indirekt schon:
// Binärdaten to string Convert.ToBase64String(...); // backto binär Convert.FromBase64String(...);
Hab den Ansatz benutzt um vorher serialisierte Objekte in XML einzubetten.
-
FreakY<3Cpp schrieb:
Worin liegt das Problem gleich alles zu laden? Kommst du etwa an 1GB Ram?
Aus den gleichen grund warum ich kein DB System nehmen darf und nur festgelegte Streams hab. Mir wird im Gesamtframework nur sehr sehr wenig Platz zugeteilt. (Code+Daten) ich muss also Sparen wo es nur geht.
Das mit den XML hab ich mir auch schon angeschaut, das wäre ein Ansatz. Dummerweise habe ich damit genau die gleichen Probleme wie mit den Speichern. Das laden würde Sequentiell gehen. Beim Ändern einzelner elemente müsste ich wohl erstmal das gesamte XML laden, die entsprechenden Elemente Modifizieren und dann wieder Speichern.
Ist irgendwie Blöd. Aber wenn es anders nicht geht muss man es halt so machen.