InvalidClassException - Read null attempting to read class descriptor for object

  • 3 Antworten
  • Letztes Antwortdatum
T

Tausendacht

Neues Mitglied
0
Hallo,

ich möchte innerhalb einer TCP-Verbindung ein einfaches serialisiertes Objekt senden. Dabei erhalte ich jedoch immer folgende Exception:

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

Gesendet wird ein Objekt folgender Klasse:

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

Gesendet wird es von der Server-Seite:

Code:
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:
Code:
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
				[COLOR="DarkOrange"]Object message = in.readObject();[/COLOR]				
				// 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, orange makiert).

2. Ich programmiere mit Eclipse (alle Dateien befinden sich im selben Projekt) und teste es dann auf 2 Samsung Galaxy Note 10.1 (Android 4.1.2). Beide greifen also auf die gleiche Quelldatei zu.

3. Früher im Programm wird bereits vom Client zum Server (also in die entgegengesetzte Richtung) ein Objekt der gleichen Klasse gesendet, was problemlos funktioniert.

4. Ich habe diese Frage bereits in einem Java-Forum gestellt, wo mir nahe gelegt wurde, dass es sich wohl um ein Android-spezifisches Problem handelt.


Ich hoffe, Ihr könnt mir weiterhelfen, was diesen Fehler auslöst und wie ich ihn beheben kann.
Danke!
 
Ich hab persönlich bisher sehr selten Objekte direkt serialisiert.
Das problem könnte aber sein, dass es sich um verschiedene Systeme handelt, da kannst du niemals sicher sein, dass beide Systeme Objekte gleich serialisieren bzw deserialisieren.

Ich würde für sowas immer die Objekte in Json verpacken.
Vorallem mit so simplen Objekten ist das sehr einfach mit Gson möglich
google-gson - A Java library to convert JSON to Java objects and vice-versa - Google Project Hosting

Da brauchst du dann eigentlich nichts weiter machen als einmal das Objekt in Json umzuwandeln und wieder zurück auf der anderen Seite.


Ansonsten sagt die Doku:
InvalidClassException (Java Platform SE 7 )

  • 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
Hast du auf beiden System die gleiche Klasse mit der gleichen serialVersionUID ?
 
Oder man schreibt sich seine eigene Serlialisierung- und Deserialisierunglogik. :D (Wenn zwei unterschiedliche Systeme im Spiel sind)
 
Hi

Vielen Dank für den Tipp!

Ich habe alles in einem Projekt programmiert und auf die Tablets die gleiche Version gezogen. Insofern bin ich mir relativ sicher, dass beide die gleiche SUID haben. Den argumentlosen Konstruktor habe ich auch und unbekannte Datentypen sollten auch keine vorhanden sein (int?).

Ich hab das Objekt in JSON verpackt. Ist ziemlich einfach und ging problemlos!

Vielen Dank!
 
Zurück
Oben Unten