Input/Output Serializable / writeObject(..) nur Sonderfälle?

Bernd Hohmann

Top Contributor
Ich habe eine Hilfsklasse, die komplett wegserialisiert werden muss. In dieser Klasse stecken auch Objekte, die erst durch eine Wrapperklasse serialisierbar werden und daher händisch in den Stream gepackt werden müssen.

Im Moment mach ich es damit, dass ich 'writeObject(...)' überschreibe und jedes Objekt zu Fuss serialisiere - was eigentlich nicht nötig wäre weil nur ein kleiner Teil der Variablen einen Wrapper benötigen.

Gibt es irgendeinen Weg zu sagen "serialisiere selber alles ausser 'transient' weg und dann komm ich mit meinen manuellen Sachen?

Die Hilfsklasse sieht zZzt. so aus (gekürzt), ImageData kommt aus dem SWT:

Code:
public class ImageCacheItem implements Serializable
	public String strOriginalFile = null;
	//
	public transient ImageData imgdOriginal = null;

	private synchronized void writeObject(ObjectOutputStream s) throws IOException {
		s.writeUTF(strOriginalFile);
		//
		s.writeObject(new SerializableImageData(imgdOriginal));
	}

	private synchronized void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
		strOriginalFile = s.readUTF();
		//
		imgdOriginal = ((SerializableImageData) s.readObject()).deserialize();
	}
}

super.writeObject(s) gibt es ja leider nicht :autsch:

Bernd
 

Bernd Hohmann

Top Contributor
writeReplace und readResolve sind für SerializationProxies :)

Was ich dazu im Netz gefunden habe, ist schon grenzdebil.

Wie ich es bis jetzt verstanden habe muss man den Proxy in das zu serialisierende Objekt einbauen (was ich bei ImageData schlecht kann - es sei denn, ich wrappe den Zugriff auf meine Hilfsklasse mit gettter/setter und bau den Proxy in meine Wrapperklasse).

Hast Du einen Pointer für Doofe wie mich was diese Proxies angeht oder eine Hilfestellung wie ich das angehen muss?

Bernd
 

Bernd Hohmann

Top Contributor
Ok, nach einem Blick in EnumSet und die ObjectStreams hab ich verstanden wie es geht.

Funktioniert aber bei mir nicht: das writeReplace() muss in den Proxy rein (hier: SerializableImageData) und der Proxy muss vorher existieren.

Wäre dadurch zu erreichen, dass SerializableImageData eine Subklasse von ImageData wird - geht aber nicht weil letztere "final" ist.

Man könnte irgendwas mogeln wenn man erfahren könnte dass die Containerklasse zur Serialisierung ansteht (da schnell die transienten ImageData in ein SerializableImageData umkopieren und den Rest der Default-Serialisierung überlassen), diese Möglichkeit gibt es aber nicht.

Schade.

Bernd
 

Kevin94

Top Contributor
Ich weis nicht ob SerializationProxies das ist, was du wirklich suchst. Rein nach deinem Eingangspost, hätte ich gesagt, dass du nach [JAPI]ObjectOutputStream#defaultWriteObject()[/JAPI] suchst. Hinterher kannst du dann noch die Wrapper für die transienten Felder in den Stream schreiben. Und beim Deserializieren das selbe: [JAPI]ObjectInputStream#defaultReadObject()[/JAPI] und danach die transienten gewrappten Sachen rauslesen.
 

Ähnliche Java Themen

Neue Themen


Oben