InvalidClassException - Read null attempting to read class descriptor for object

Tausendacht

Mitglied
Hallo,

ich erhalte beim Senden eines einfachen serialisierten Objekts innerhalb einer TCP-Verbindung folgenden Fehler:

Code:
java.io.InvalidClassException: Read null attempting to read class descriptor for object

Gesendet wird ein Objekt folgender Klasse:

Java:
public class CodeMessage implements Serializable 
{
	private static final long serialVersionUID = 3850374419322130176L;
	private int code;
	
	public CodeMessage(int code){this.code = code;  }
	
	public int getCode(){return code;}
}

Gesendet wird es von der Server-Seite:

Java:
public class TCPServer extends Thread 
{
    private ObjectOutputStream out;

    [ . . . ]

	public boolean sendMessage(Object object)
	{
		boolean success;
		if(out == null)
		{
			success = false;
		}
		else 
		{
			try {
				out.writeObject(object);
			} catch (IOException e) {	Log.e("TCPServer sendMessage()", e.getMessage());
                  return false;	}
			success =  true;
		}
		return success;
	}
}

Empfangen wird es von der Client-Seite:
Java:
public class TCPClient extends Thread 
{
    private ObjectInputStream in;

    [ . . . ]

    @Override
	public void run() 
	{
		super.run();
		
		try {			
			// messages-recieving-loop
			while (!isInterrupted())
			{
				// Try to read sent object
				Object message = in.readObject();				
				// pass it to the listener
				if ((message != null) && (messageListener != null))
				{
					messageListener.messageReceived(message);
				}
			}
		} catch (InvalidClassException e){ 
			Log.e("TCPClient.run() InvalidClassException", e.getMessage()); 
		} catch (Exception e){ Log.e("TCPClient.run()", e.getMessage()); }		
	}
}

Noch ein paar Anmerkungen:

1. Die Exception tritt beim Lesen des eingegangenen Objektes auf (Client, Zeile 17).

2. Bei dem Programm handelt es sich um eine Android-App, d.h. ich programmiere mit Eclipse und teste es dann auf 2 Samsung Galaxy Note 10.1. Beide greifen also auf die gleiche Quelldatei zu.

3. Früher im Programm wird bereits vom Client zum Server ein Objekt einer anderen Klasse gesendet, was problemlos funktioniert.


Ich hoffe, Ihr könnt mir weiterhelfen, was diesen Fehler auslöst und wie ich ihn beheben kann.
Danke!
 
Hi,

Client und Server sind im gleichen Projekt geschrieben und greifen auf die gleiche Klasse zu.

Auf beiden Geräten ist die gleiche Version drauf (mehrfach "zeitgleich" neu installiert).

Die SUID ist habe ich nach der Programmierung der Klasse generieren lassen.
 
public class InvalidClassException
extends ObjectStreamException

Thrown when the Serialization runtime detects one of the following problems with a Class.

* The serial version of the class does not match that of the class descriptor read from the stream
* The class contains unknown datatypes
* The class does not have an accessible no-arg constructor

d.h. Du brauchst einen argumentlosen Konstruktor:
Java:
public CodeMessage(){
}
 
Hi,
Ich glaube, dass hatte ich schon einmal probiert.

Ich hab's aber grad nochmal getestet: Argumentlosen Konstruktor hinzugefügt, SUID neu generiert, und auf beide Geräte neuinstalliert.
Leider gibt's wieder eine InvalidClassException...


Was bedeutet denn die Fehlerbeschreibung "Read null attempting to read class descriptor for object". Ich habe viele Forenbeiträge zu InvalidClassException gelesen, aber das stand nie dabei.
 
Zuletzt bearbeitet:
d.h. Du brauchst einen argumentlosen Konstruktor

Das stimmt nicht. Die Doc ist hier etwas ungenau. Die Klassen werden sowieso über Reflection instanziert, sogar private Konstruktoren mit Argumenten machen keine Probleme.

Was den Fehler angeht bin ich, sofern es wirklich Android spezifisch ist, so kann ich leider nichts dabei steuern.
 
Nun ja, da weis ich auch nicht wirklich weiter.
Das einzige was mir noch einfallen würde wäre, dass die Klasse vielleicht der Bean-Spezifikation
genügen muss (also noch eine Setter-Methode setCode braucht). Ist bei manchen Frameworks so.
 
Hallo,

zunächst einmal Danke Euch beiden für die Hinweise. Leider hat die Setter-Methode auch keinen Fortschritt gebracht.

Ich habe das Programm mal testweise so umgeschrieben, dass beim Auftreten der Exception ein Objekt zurückgesendet wird, das dem Server meldet, dass im Client eine Exception aufgetreten ist.
Das Senden von Client zu Server klappt dabei jedes Mal problemlos.

Kann der Fehler also mit dem OutputStream des Servers bzw dem InputStream des Clients zusammenhängen? Dass die nicht richtig initialisiert sind oder sowas?
 
Ich habe das Problem für mich gelöst, bzw vielmehr habe ich es umgangen.

Anstatt ein Objekt das das Interface Serializable implementiert zu übertragen habe ich das Objekt mittels GSON in JSON verpackt. War einfach und hat auf Anhieb geklappt.
 

Zurück
Oben