Änderung des Objekts wird nicht serialisiert

Xeonkryptos

Bekanntes Mitglied
Moin Community,

ich habe erst kürzlich begonnen, die Serialisierung zu verwenden und habe bis jetzt, erste mal Testen und so, nur ein Problem. Ich habe eine Klasse User, die einen Namen und einen Status enthält. Nun kann sich der Status ändern und der Client soll dies dem Server mitteilen, damit alle anderen User auch sehen, dass der User seinen Status geändert hat.
Nun hab ich das Problem mit der Serialisierung lösen wollen und es ist für mich ein guter Ansatz, doch wenn ich zum zweiten Mal das Objekt mit derselben Referenz nur dem geänderten Status rüberschicke, kommt der neue Status beim Server nicht an. Ich weiß gerade nicht, wieso dass so ist? Ich hab mich ein bisschen informiert, doch sind die meisten Texte dahingehend zu schwammig für mich und unklar, ob Änderungen überhaupt mitgelesen werden oder nicht, sofern die Referenz die selbe ist.

Brauche Hilfe. ???:L
 

Xeonkryptos

Bekanntes Mitglied
Richtigen Code brauch ich eigentlich nicht posten oder kann ich nicht, da ich einfach nur den ObjectInputStream und ObjectOutputStream auf Client und Server verwende, die soweit connecte (normale Prozedur mit den Sockets) und bei einer Änderung das einfach ganz normal serialisieren und deserialisieren lasse, mit dem Standardserialisierer, da Strings auch "serializable" sind.

Im Code steht einfach nur: Schieb das User-Objekt zum Server und der Server liest einfach nur und prüft, ob das einkommende Objekt vom Typ User ist (Vermeidung einer ClassCastException) und mehr mach ich nicht. Nichts weltbewegendes, eigentlich.
 
M

Marcinek

Gast
Sorry, dann sehe ich kein Fehler.

Aber vieleicht findet sich ja jemand, anders im Forum der Lust auf raten hat.
 

Xeonkryptos

Bekanntes Mitglied
Also, da ich Zeit hatte und selbst nicht auf den Fehler komme, hab ich kein Testprogramm, aber Testklassen geschrieben, die im Grunde genau das Wiedergeben, was ich persönlich mache. Natürlich ist diese Version abgespeckt und ggf. nicht zum sofortigen Ausführen gedacht, es zeigt, aber meine Vorgehensweise und hoffentlich meinen Fehler:

Abgespeckter Client

Java:
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TestClient {

	private ObjectOutputStream output;
	private User user;

	public TestClient(Socket socket) throws IOException {
		OutputStream localOutput = socket.getOutputStream();
		output = new ObjectOutputStream(localOutput);
	}

	public void anyMethod() throws IOException {
		/*
		 * Davon ausgehend, dass der User hier schon geändert wurde. Einfach nur
		 * EINE Instanzvariable "status" über einen Setter bzw eine spezielle
		 * Edit-Methode, die auf den Setter intern zugreift
		 */
		output.writeObject(user);
	}
}

Abgespeckter Server

Java:
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;

public class TestServer {

	private ObjectInputStream input;

	public TestServer(Socket socket) throws IOException {
		InputStream localInput = socket.getInputStream();
		input = new ObjectInputStream(localInput);
	}

	public void anyMethod() throws ClassNotFoundException, IOException {
		Object obj = input.readObject();
		if (obj instanceof User) {
			/*
			 * Zur Überprüfung, da schon hier der geänderte Status stimmen muss
			 * zur Weiterverarbeitung
			 */
			System.out.println(((User) obj).getStatus());
			/*
			 * Hier kommt die Ausgabe: Nichts... Sollte aber schon ein Status
			 * stehen und hier befindet sich mein Problem
			 */
		}
	}
}

User-Klasse mit den Informationen der einzelnen User.

Java:
import java.io.Serializable;

public class User implements Serializable {

    private static final long serialVersionUID = 1756760419000304659L;
	private String name;
	private String status;
	private boolean hasStatus = false;

	public User(String name, String status) {
		setStatus(status);
		setName(name);
	}

	/**
	 * Verändert den Usernamen
	 * 
	 * @param name
	 *            Name des Users
	 */
	private void setName(String name) {
		if (name == null)
			throw new IllegalArgumentException("name == null");
		if (name.trim().isEmpty())
			throw new IllegalArgumentException("name is an empty string");
		this.name = name;
	}

	/**
	 * Ändert den Status des Users
	 * 
	 * @param status
	 *            Status
	 */
	private void setStatus(String status) {
		if (status == null || status.trim().isEmpty()) {
			this.status = "";
			hasStatus = false;
			return;
		}
		this.status = "<" + status + ">";
		hasStatus = true;
	}

	/**
	 * Gibt den Namen des Users zurück
	 * 
	 * @return Name
	 */
	public String getName() {
		return name;
	}

	/**
	 * Gibt den Status des Users zurück
	 * 
	 * @return Status
	 */
	public String getStatus() {
		return status;
	}

	/**
	 * Gibt den Status + Usernamen zurück (Darstellung des Users)
	 * 
	 * @return vollständige Userdarstellung
	 */
	public String getUser() {
		if (!hasStatus) {
			return getName();
		}
		return getName() + getStatus();
	}

	@Override
	public void editElement(Object... element) {
		if (element[0] instanceof String) {
			setStatus((String) element[0]);
		}		
	}
}
 

Xeonkryptos

Bekanntes Mitglied
Keiner eine Idee, wo mein Fehler liegen könnte oder woran es liegt, dass er denselben User ändert, aber am Ende des Streams unverändert ankommt?
 

Xeonkryptos

Bekanntes Mitglied
Wie beug ich dem Cache vor? Ich finde oft nur etwas bezogen auf den ObjectOutputStream, den man einfach resetten kann, aber nichts über den InputStream oder ich bin einfach zu blind. :)

Zumindest verliere ich die Verbindung, wenn ich den InputStream resette. :)
 

Xeonkryptos

Bekanntes Mitglied
Javadoc von den streams lesen, insbesondere den object streams wäre ein anfang

Jetzt hab ich mich mal rangesetzt und den ganzen Text gelesen, doch das einzige, was ich beim ObjectInputStream verwertbares gefunden hab, ist dies hier:
New objects are always allocated when deserializing, which prevents existing objects from being overwritten.
und das hilft mir nicht viel weiter. Jetzt bin ich meinem Problem immer noch keinen Schritt näher gekommen, bzw der Lösung...

Edit: Problem gelöst. Anstatt einfach die Streams bloß mit einem Reset von "Altlasten" zu befreien, schreibe ich die Objekte nicht mit der writeObject-Methode, sondern mit der writeUnshared.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Socket Änderung an Netzwerkchat führt zu Fehlern Netzwerkprogrammierung 0
D RMI Gui auf client updaten basierend auf den Property Änderung des Models auf dem Server ohne polling Netzwerkprogrammierung 12
R Änderung einer Seite (Klasse URL) Netzwerkprogrammierung 2
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
OnDemand JMS Messages wird gecached Netzwerkprogrammierung 2
P RMI stub wird nicht gefunden Netzwerkprogrammierung 8
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
M com.google.gson wird nicht erkannt Netzwerkprogrammierung 2
F Website parsen, die mit javascript zusammengebaut wird Netzwerkprogrammierung 1
P Socket Server übertragung wird immer langsamer Netzwerkprogrammierung 4
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
L Server anpingen (Pingzeit) ?? Pingzeit wird nicht verändert Netzwerkprogrammierung 6
M JSP wird im gesamten Projekt nicht neugeladen Netzwerkprogrammierung 3
K Socket InputStream wird nicht erzeugt Netzwerkprogrammierung 4
R Socket SSL-Connect in Servlet - keystore wird nicht gefunden Netzwerkprogrammierung 2
S anderer Rechner wird nicht gefunden Netzwerkprogrammierung 20
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
M Socket TCP keep alive Exception wird nicht ausgelöst Netzwerkprogrammierung 11
F getSource Methode wird als Bot erkannt Netzwerkprogrammierung 8
Dit_ RMI setSoTimeout wird ignoriert? Netzwerkprogrammierung 3
lumo String[] wird zu null bei Serialisierung Netzwerkprogrammierung 8
J method = PUT, aber ausgeführt wird doGet...? Netzwerkprogrammierung 4
K Was wird genau per Telnet verschickt ? Netzwerkprogrammierung 5
M Dateidownload per FTP wird immer langsamer und bleibt dann stehen Netzwerkprogrammierung 3
J BufferedReader.ready() wird nicht true Netzwerkprogrammierung 10
A Socket BufferedReader.readLine() blockiert bis ein im Socket OutputStream was gesendet wird ... Netzwerkprogrammierung 9
C RMI Klasse wird unter falschem Pfad gesucht Netzwerkprogrammierung 4
B Server-Programm wird durch "read" beendet Netzwerkprogrammierung 8
A Socket Client Server Connection wird aufgebaut aber keine daten geschickt. Netzwerkprogrammierung 5
N Socket Verbindung wird immer verweigert Netzwerkprogrammierung 5
K HTTP-Anfrage an einen Server wird nicht beantwortet Netzwerkprogrammierung 3
M URL Handler wird nicht gefunden Netzwerkprogrammierung 6
L SSL Verbindung aber Server wird erst im Programm festgelegt Netzwerkprogrammierung 4
L Https Verbindung wird aus jar heraus nicht aufgebaut Netzwerkprogrammierung 12
C Download-Fortschritt wird falsch angezeigt. Netzwerkprogrammierung 2
A Quellcode von Homepage wird nicht komplett eingelesen Netzwerkprogrammierung 5
V RMI: code wird einfach übergangen ? Netzwerkprogrammierung 3
A FileChannel+SocketChannel:Datei wird nur teilweise übertrage Netzwerkprogrammierung 4
F Stream wird als Char übertragen. Char -> in String umwand Netzwerkprogrammierung 5
L RMI-Funktion wird lokal ausgeführt Netzwerkprogrammierung 12
A RMI: Wo wird die Methode ausgeführt? Netzwerkprogrammierung 9
P JNDI LDAP-SSL Verbindung, Zertifikat wird nicht angezeigt ? Netzwerkprogrammierung 2
A JavaMail Problem - Nachricht wird nicht versendet ? Netzwerkprogrammierung 9
T finlalize Methode vom Server wird nicht aufgerufen Netzwerkprogrammierung 4
B Socket wird nicht richtig geschlossen Netzwerkprogrammierung 2
K mapSystemException wird geworfen Netzwerkprogrammierung 2
L Attachment wird nicht angezeigt in der Email Netzwerkprogrammierung 3
P RMI - meine Stub-Class wird nicht gefunden Netzwerkprogrammierung 9
G Socket wird nach Portscann geschlossen Netzwerkprogrammierung 2
R Socket wird nicht ausgeführt Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben