Laden...

Serializer-Frage

Erstellt von Guggsdu vor 19 Jahren Letzter Beitrag vor 19 Jahren 4.712 Views
Guggsdu Themenstarter:in
220 Beiträge seit 2004
vor 19 Jahren
Serializer-Frage

Tach zusammen!

Wenn ich ein Objekt serialisiere (mittels BinaryFormatter) werden dort (leider) auch Metadaten der serialisierenden Assembly mit reingepackt. Das hat zur Folge, daß ich das serialisierte Objekt nur mit demselben Programm (sprich: Assembly) wieder deserialisieren kann.

Gibt es einen Weg, diese Metadaten auszublenden, sodaß sie nicht mit serialisiert werden? (Am besten eine Variante ohne den Serialisierungs-/ Deserialisierungs-Prozess neu zu schreiben).

Als Objekt könnte man zum Beispiel eine DataTable nehmen.

Gruß
Guggsdu

Gruß
Guggsdu

P
939 Beiträge seit 2003
vor 19 Jahren

Ich hatte mal in eine Soap-serialisierte Datei reingeschaut. Da standen nur Namen und Werte, aber keine Typen drin, wenn ich mich richtig entsinne.

D
279 Beiträge seit 2004
vor 19 Jahren

In .NET 1.x kann man eine DataTable bzw. DataSet doch gar nicht wirklich binär serialisieren oder täusche ich mich da?

In .NET 2.0 sieht es da schon anders aus (gibt eine neue RemotingFormat - Eigenschaft).

K
355 Beiträge seit 2004
vor 19 Jahren

Wenn du die Codezeile noch einfügst, dann schreibt er die Assemblydaten nicht mit:


BinaryFormatter formatter = new BinaryFormatter();
formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;

Hoffe ich konnte dir helfen

Guggsdu Themenstarter:in
220 Beiträge seit 2004
vor 19 Jahren

Original von Denny
In .NET 1.x kann man eine DataTable bzw. DataSet doch gar nicht wirklich binär serialisieren oder täusche ich mich da?

--> Da täuschst Du Dich tatsächlich. Man kann eine DataTable sehr wohl binär serialisieren!

Gruß
Guggsdu

Gruß
Guggsdu

Guggsdu Themenstarter:in
220 Beiträge seit 2004
vor 19 Jahren

Tacho!

Die Zeile

formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;

genügt leider nicht. Die zweite (deserialisierende) Assembly fragt immernoch wo denn die erste Assembly ist!

Übrigens: Ich habe festgestellt: mit DataTable gehts auch so, nur leider mit eigenen Objekten nicht.

Gruß
Guggsdu

Gruß
Guggsdu

P
939 Beiträge seit 2003
vor 19 Jahren

Hmm, das ist aber was ganz anderes. Du möchtest gerade, dass Type-Informationen mit serialisiert und später wieder rekonstruiert werden. Das passiert auch im allgemeinen. Trotzdem werden zur Laufzeit die Assemblies benötigt, gegen die kompiliert wurde. Es müssen aber nicht die gleichen Klassen sein, die serialisiert werden. Hauptsache die Schnittstelle/das Gerüst stimmt überein.

Was möchtest du denn genau machen? Bring mal bisschen Licht ins Dunkel.

F
124 Beiträge seit 2004
vor 19 Jahren

eigene objekte gehen bei dir nicht, weil du sie nicht als serialisierbar (serializable()) markiert hast. alternativ könntest du glaub ich auch die ISerialize (oder so ähnlich) - Schnittstelle implementieren, dann können deine klassen auch serialisiert werden. das erste mit dem attribut is aber einfacher.

Guggsdu Themenstarter:in
220 Beiträge seit 2004
vor 19 Jahren

Nee, nee!

Ich habe meine KLassen schon als Serializable gekennzeichnet, sonst könnte ich sie ja nochnichemal serialisieren. Das klappt aber. Nur krieg ich sie mit einer anderen Applikation nicht wieder raus.

Ich wollte gern eine Dictionary-Klasse (abgeleitet von DictionaryBase) in einer Anwendung benutzen. Die Einträge in das Dictionary soll aber jemand anderes machen, der nicht gleich die ganze Applikation erhalten soll. Dem wollte ich sozusagen einen Editor schreiben. Er soll das Dic bearbeiten und in eine Datei reinquetschen (serialisieren). Und ich wollte das dann wieder auslesen.

So is das.

Gruß
Guggsdu

Gruß
Guggsdu

D
279 Beiträge seit 2004
vor 19 Jahren

Original von Guggsdu

Original von Denny
In .NET 1.x kann man eine DataTable bzw. DataSet doch gar nicht wirklich binär serialisieren oder täusche ich mich da?

--> Da täuschst Du Dich tatsächlich. Man kann eine DataTable sehr wohl binär serialisieren!

Gruß
Guggsdu

Könntest du mir dazu ein Codebeispiel geben oder mir die binäre DataTable zeigen? Dachte bis heute, dass es nicht geht.

6.862 Beiträge seit 2003
vor 19 Jahren

Könntest du nicht einfach ne Lib erstellen mit der Klasse und in beiden Projekten referenzieren?

Baka wa shinanakya naoranai.

Mein XING Profil.

Guggsdu Themenstarter:in
220 Beiträge seit 2004
vor 19 Jahren

Naja die zu serialisierende Klasse benutze ich natürlich in beiden Assemblies.Klappt trotzdem nicht. Ob's mit ner dll besser geht, glaube ich nicht, weil Du ja trotzdem nur die Klasse verfügbar machst.

@Denny:

probier's doch einfach selber mal aus! Da gehören noch nichtmal viele Codezeilen dazu!
Erstelle einen DataTable mit ein paar Spalten, knüpper am Besten ein Datagrid dran, schreibe ein paar Daten rein und serialisiere das Ganze in eine Datei (mit BinärFormatter)

Oder guck einfach mal in die SDK-Hilfe, dort ist der DataTable [Serializable] markiert.

Gruß
Guggsdu

PS: Mit nem DataTable funktioniert das Deserialisieren auch mit einer anderen Assembly. Nur eben mit eigenen klassen nicht. (Hatte mich im ersten Posting geirrt)

Gruß
Guggsdu

D
279 Beiträge seit 2004
vor 19 Jahren

Was kommt denn genau für eine Fehlermeldung?
Hast du es schonmal mit was anderem als binärer Serialisierung verscht (Xml?)?
Zeig doch mal den Code deiner eigenen Klasse.

Zur DataTable:
Wenn du diese mit einem BinaryFormatter serialisierst, dann ist es trotzdem XML-Format, du ziehst also überhaupt keinen Nutzen aus der binären Serialisierung, im Gegenteil die Datei wird oftmals sogar noch größer. Du kannst dir eine binär serialisierte DataTable ja mal als Datei anschauen.
Wiegesagt wurde das im .NET Framework 2.0 nun verbessert.

Guggsdu Themenstarter:in
220 Beiträge seit 2004
vor 19 Jahren

Ich habe den Code jetzt nicht am Mann. Die Fehlermeldung sieht aber ungefähr so aus, daß die ursprüngliche Assembly [Assemblyname] nicht gefunden werden konnte.

Als Test verwende doch mal folgende ganz einfache Klasse:


class TestClass
{
private int a = 123;

public int A{
get{return a;}
set{a = value;}
}


Gruß
Guggsdu

Gruß
Guggsdu

D
279 Beiträge seit 2004
vor 19 Jahren

Es geht auf jeden Fall, wenn du die Klasse aus der selben Assembly in beiden Projekt verwendest.

Entweder referenzierst du also das eine Projekt in dem anderen oder du packst die Klasse in eine eigene Assembly, wie talla schon vorgeschlagen hat.

Guggsdu Themenstarter:in
220 Beiträge seit 2004
vor 19 Jahren

Jo-das geht! In eine eigene dll packen und dann funzts. Eigentlich auch logisch: weil die Assembly ja dann wirklich die gleich ist.

Ich entschuldige mich für meine Ungläubigkeit und gelobe Besserung!!

Gruß und danke

Guggsdu

Gruß
Guggsdu

F
124 Beiträge seit 2004
vor 19 Jahren

und hier nochmal die erklärung:

wenn du eine dll nutzt, dann hast du wirklich ein und die selbe klasse. hast du aber die entsprechende cs-datei in beiden projekten seperat drin, dann haste zwar 2 klasse, die gleich heißen und das gleiche machen. aber es sind halt nur gleiche klassen und nichtg dieselben und deshalb mecker der serializer!

333 Beiträge seit 2004
vor 19 Jahren

Original von KRambo
Wenn du die Codezeile noch einfügst, dann schreibt er die Assemblydaten nicht mit:

  
BinaryFormatter formatter = new BinaryFormatter();  
formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;  
  

Hoffe ich konnte dir helfen

Der Simple-Style verdeckt lediglich die Versionsnummer, nicht aber den Assemblynamen. Das kann verwenden um die zu serialisierende Klasse auch unabhängig von der Assemblyversion wieder deserialisieren zu können.

Und wenn man übrigens eine Klasse direkt in 2 verschiedenen Assemblies verwendet ohne diese jedoch über eine Bibliothek zu referenzieren, geht es nur noch über ISerializable.

([bb]|[^b]{2})