Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Serializer-Frage
Guggsdu
myCSharp.de - Member

Avatar #avatar-1542.jpg


Dabei seit:
Beiträge: 220

Themenstarter:

Serializer-Frage

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Pulpapex
myCSharp.de - Member



Dabei seit:
Beiträge: 939
Herkunft: Rostock

beantworten | zitieren | melden

Ich hatte mal in eine Soap-serialisierte Datei reingeschaut. Da standen nur Namen und Werte, aber keine Typen drin, wenn ich mich richtig entsinne.
private Nachricht | Beiträge des Benutzers
Denny
myCSharp.de - Member



Dabei seit:
Beiträge: 279
Herkunft: Koblenz

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
KRambo
myCSharp.de - Member



Dabei seit:
Beiträge: 355

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Guggsdu
myCSharp.de - Member

Avatar #avatar-1542.jpg


Dabei seit:
Beiträge: 220

Themenstarter:

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers
Guggsdu
myCSharp.de - Member

Avatar #avatar-1542.jpg


Dabei seit:
Beiträge: 220

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Pulpapex
myCSharp.de - Member



Dabei seit:
Beiträge: 939
Herkunft: Rostock

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Fabse
myCSharp.de - Member



Dabei seit:
Beiträge: 124

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Guggsdu
myCSharp.de - Member

Avatar #avatar-1542.jpg


Dabei seit:
Beiträge: 220

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Denny
myCSharp.de - Member



Dabei seit:
Beiträge: 279
Herkunft: Koblenz

beantworten | zitieren | melden

Zitat
Original von Guggsdu
Zitat
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.
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Könntest du nicht einfach ne Lib erstellen mit der Klasse und in beiden Projekten referenzieren?
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
Guggsdu
myCSharp.de - Member

Avatar #avatar-1542.jpg


Dabei seit:
Beiträge: 220

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Denny
myCSharp.de - Member



Dabei seit:
Beiträge: 279
Herkunft: Koblenz

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Guggsdu
myCSharp.de - Member

Avatar #avatar-1542.jpg


Dabei seit:
Beiträge: 220

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Denny
myCSharp.de - Member



Dabei seit:
Beiträge: 279
Herkunft: Koblenz

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Guggsdu
myCSharp.de - Member

Avatar #avatar-1542.jpg


Dabei seit:
Beiträge: 220

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Fabse
myCSharp.de - Member



Dabei seit:
Beiträge: 124

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
NoOneKnows
myCSharp.de - Member

Avatar #avatar-1526.gif


Dabei seit:
Beiträge: 333
Herkunft: Hannover

beantworten | zitieren | melden

Zitat
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})
private Nachricht | Beiträge des Benutzers