Dieser Socket empfängt weiterhin einige alte Objekte und neue Objekte mit gleichen Namen. Allerdings, wenn ich readObject direkt verwendet, wird es schwerwiegende Ausnahme ausgelöst. Einige von uns würden vorschlagen, altes Objekt zu ignorieren oder den alten Objektcode zu ändern. Dies ist für mich nicht möglich, Client-Codes zu ändern. Ich muss die Abwärtskompatibilität behandeln.Java-Abwärtskompatibilität: Wie liest readObject() gleiche Klassennamenobjekte mit unterschiedlicher serialVersionUID?
Socket s = ss.accept();
ObjectInputStream lvStream = new ObjectInputStream(s.getInputStream());
Object lvObject = lvStream.readObject();
// The old class but released (I cannot change it)
public class Apple extends HashMap<String, String> {
private static final long serialVersionUID = 1L;
}
// The old class but released (I cannot change it)
public class Apple extends HashMap<String, String> {
private static final long serialVersionUID = 2L;
}
// The new class in my local (1L or 2L still would not solve the issue easily)
public class Apple extends HashMap<String, String> {
private static final long serialVersionUID = 2L;
}
an der Linie von readObject-(), Ich habe diese schwerwiegende Ausnahme:
java.io.InvalidClassException lokale Klasse unvereinbar: stream classdesc serialVersionUID = 1, lokale Klasse serialV ersionUID = 2
Wie konnte ich diese zwei Arten von Apple-Objekten Daten (die Hashmap) lesen?
Vielen Dank.
hilft "Sie sind völlig gleich" - nein, sie sind in verschiedenen Paketen, nach zu deinem Kommentar. Der vollständig qualifizierte Klassenname ist in der Serialisierung (und im Allgemeinen) wichtig. –
Fragen Sie, wie man ein serialisiertes Objekt einer Klasse als eine Instanz der anderen Klasse liest? – qxz
Sie sind zwei verschiedene Arten. Die serielle UID-Version hat damit nichts zu tun. Wirf entweder auf "HashMap" und lies seine Einträge. – erickson