Entwickler-Ecke

IO, XML und Registry - Dateien in Objekt speichern und serialisieren


Rahvin - Do 26.02.09 20:59
Titel: Dateien in Objekt speichern und serialisieren
Hallo,

ich hab ein kleines Programm geschrieben um Vorgänge zu verwalten. Der Benutzer kann zu jedem Vorgang beliebig viele Dokumente speichern. Das Vorgansobjekt samt Dateien wird zum Speichern in eine Datei serialisiert. Allerdings wird aus einer 100 kb Datei nach der Serialisierung eine ca. 2 MB große Datei. Ich speichere die Dateien in 2048 kb Blöcken in einer Arraylist.

Meine Frage: Gibt es eine Möglichkeit die Dateien platzsparender in einem Objekt zu speichern und zu serialisieren?

Bin für jeden Tip dankbat :).


Kha - Do 26.02.09 23:26

Ohne zu wissen, welchen Serializer du überhaupt benutzt, kann man dir nur schwer helfen :| . Aber dieser riesige Unterschied hört sich nach XML an und dann liegt es eben in der Natur der Sache. Wenn du an XML festhalten willst, wirst du die Daten wohl oder übel in einer zweiten Datei speichern müssen, also über einen Stream.


JüTho - Fr 27.02.09 12:04

Übrigens gehört ArrayList seit NET 2.0 in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic. Jürgen


Rahvin - Fr 27.02.09 21:13

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Ohne zu wissen, welchen Serializer du überhaupt benutzt, kann man dir nur schwer helfen :| . Aber dieser riesige Unterschied hört sich nach XML an und dann liegt es eben in der Natur der Sache. Wenn du an XML festhalten willst, wirst du die Daten wohl oder übel in einer zweiten Datei speichern müssen, also über einen Stream.

Oh, hab ich ganz vergessen :D, es ist der Binary-Serializer. Das ist auch das, was mich etwas verwundert.

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Übrigens gehört ArrayList seit NET 2.0 in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.

Die ArrayList war eigentlich auch nur eine Notlösung. Ich wollte die Datei eigentlich komplett in einen Byte-Array einlesen. Da der BinaryReader aber nur ein blockweises lesen zulässt, habe ich die einzelnen Blöcke in eine ArrayList gepackt ohne weiter drüber nachzudenken...
Wenn Du eine gute Lösung hast, um die Datei binär in einem Objekt zu speichern, bin ich ganz Ohr :D.


Kha - Fr 27.02.09 21:19

user profile iconRahvin hat folgendes geschrieben Zum zitierten Posting springen:
Das ist auch das, was mich etwas verwundert.
Ok, dann liegt es an der ArrayList. Stattdessen könntest du z.B. das Byte-Array von File.ReadAllBytes serialisieren. byte[] (und damit auch List<byte>) wird quasi ohne Overhead serialisiert.


Rahvin - So 01.03.09 19:10

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconRahvin hat folgendes geschrieben Zum zitierten Posting springen:
Das ist auch das, was mich etwas verwundert.
Ok, dann liegt es an der ArrayList. Stattdessen könntest du z.B. das Byte-Array von File.ReadAllBytes serialisieren. byte[] (und damit auch List<byte>) wird quasi ohne Overhead serialisiert.


Danke, klappt bestens mit ReadAllBytes, die Dateien sind jetzt wesentlich kleiner :). Schon interessant was für einen Overhead die Arraylist hat.