Hallo!
Ich staunte nicht schlecht als ich neulich in der Java - API in der Dokumentation der Klasse „Class“ über die Zeile „implements: Serializable“ steuperte… Das wundert mich deswegen, weil z.B. Klassen wie „Method“ nicht serialisierbar sind.
Mal ein Frage dazu: Wenn ich jetzt z.B. zwei Rechner über ein Socket kommunizieren lasse und Rechner A schickt Rechner B ein Class-Objekt (weil’s ja angeblich serialisierbar ist), kann Rechner B die Klasse dann einfach mal eben so benutzen??? Dann könnte man ja das Objekt auch z.B. in eine Datei schreiben und später wieder aus der Datei einlesen und sofort wieder verwenden, oder? (will sagen: Man kann das Kopieren von *.class - Dateien über’s Netzwerk umgehen)
Florian
Hallo!
Mal ein Frage dazu: Wenn ich jetzt z.B. zwei Rechner über ein
Socket kommunizieren lasse und Rechner A schickt Rechner B ein
Class-Objekt (weil’s ja angeblich serialisierbar ist), kann
Rechner B die Klasse dann einfach mal eben so benutzen???
Nein, dafür braucht er die *.class-Datei auf der Festplatte. Dies geht aber ohne weiteres; (bei entsprechender Security-Policy) kann der Client vom Server (z.B. bei RMI) den Code für eine Klasse nachladen.
Am Class-Objekt fehlt IMHO der Code. Auch wird das Class-Objekt beim deserialisieren nicht beim Class-Loader registriert und kann mölicherweise zu Problemen führen weil es dann ggf. mehr als ein Objekt mit gleichem Klassennamen in der VM gibt.
Jetzt müsste man mal testen was wirklich passiert:
Aufgrund der Referenz auf die Klasse müsste ja der Client vermutlich versuchen den Code nachzuladen. Wenn das gelingt wird dann beim deserialisieren die Referrnz auf das serialisierte Class-Objekt automatich durch eine Referenz auf das beim Class-Loader registierte Class-Objekt ersetzt?
Dann könnte man ja das Objekt auch z.B. in eine Datei
schreiben und später wieder aus der Datei einlesen und sofort
wieder verwenden, oder? (will sagen: Man kann das Kopieren von
*.class - Dateien über’s Netzwerk umgehen)
Das geht eben nicht, weil sich in der Datei nicht der Code der Klasse befindet.
Hi!
Ich hab’ folgenden Kommentar in der Java - API - Dokumenatation gefunden - kann damit jemand was anfangen? 
Class Class is special cased within the Serialization Stream Protocol. A Class instance is written intially into an ObjectOutputStream in the following format:
TC_CLASS ClassDescriptor
A ClassDescriptor is a special cased serialization of
a java.io.ObjectStreamClass instance.
A new handle is generated for the initial time the class descriptor is written into the stream. Future references to the class descriptor are written as references to the initial class descriptor instance.
Florian