.Net und seine Serialisierung
-
Hallo,
ich habe ein klitzekleines Problem mit Objektserialisierung. Ich benutze den BinaryFormater und schicke die Objekte per Socket an einen anderen Computer.
Ein Feature, was ich normalerweise gar nicht so schlecht finden würde, bricht mir aber jetzt gerade dabei das Genick. Ich krieg grundsätzlich beim Deserialisieren InvalidCastExceptions mit der Meldung "cannot cast from 'foo.bar.Blubb' to 'foo.bar.Blubb'".
Ja, der Klassenname ist identisch. Eine genauere Untersuchung mit Hilfe von Reflection hat zu Tage geführt, dass es tatsächlich verschiedene Typen sind, denn sie gehören unterschiedlichen Assemblies an.Ich krieg einen zuverlässigen Transfer hin, wenn ich die Release-Version kopiere und bei beiden Rechnern verwende. Das wäre für das Deployment auch überhaupt kein Problem, aber arbeiten kann ich so nicht anständig. Ich muss das Teil entwickeln und debuggen können und mit der Debug-Version funktioniert es nicht.
Kann man die Serialisierung in entsprechender Weise beeinflussen ohne
- ISerializable zu implementieren ?
- einen eigenen Formatter zu schreiben ?In Java kann man über SerializationIds festlegen, welche Klassen kompatibel sind. So einen Mechanismus habe ich in .Net bisher nicht entdeckt.
Danke schon mal im Voraus.
-
Hi,
serialisiere die Daten mal in eine Datei. Dann schau dir mal die Datei im HexEditor an. Du wirst feststellen, dass die Version, zum Beispiel "Version=1.0.1873.33627" in die binäre Datei geschrieben wird. Ich denke, dass die Version ebenfalls über die Sockets übertragen wird, und dort bei der Deserialisierung überprüft wird. Wenn du die eine Seite der Programmverbindung im Studio startest, wird aber dabei die Versionsnummer erhöht. Das bedeutet, dass die Vesionsnummer auf dem anderen Rechner im Moment der Ausführung eine andere Versionsnummer hat. Das kannst du verhindern, indem du:[assembly: AssemblyVersion("1.0.*")]
durch
[assembly: AssemblyVersion("1.0.1")]
ersetztDieses Überprüfung findet soweit ich weiss nur statt, wenn man die 2005-Version benutzt. Die 2003-Version macht das glaub ich nicht.
Liege ich da richtig, dass du 2005 verwendest ?
und dass das Problem mit der Fixierung der AssemblyVersion gelöst ist ?
-
Hi,
ja ich verwende 2005. Jetzt hab ich grad sogar was noch einfacheres gefunden. In den Project Settings unter publish gibt's so ein hackerl "automatically increment... ".Seltsamerweise ist das hackerl, wenn ich es weggemacht habe und die seite neu aufrufe, wieder da. Geht aber immer noch alles. Wenn ich es dann weg und wieder hin mache, geht's wieder nicht. Wird wohl ein Bug sein...
Danke auf jeden Fall mal. Meine bisherige Lösung zum debuggen war Recht umständlich: Full Build, mit Debugger starten (weil er da noch was fertig baut), VS verlassen, Projekt kopieren, beide mit nem eigenen VS starten und nicht mehr vorher builden.
Das wird mir jetzt das Leben einfacher machen, danke.