Hallo!
Ich versuche gerade ein C# und ein Javaprogramm mittels JSON über Sockets kommunizieren zu lassen. Dafür habe ich in C# und in Java zwei identische Klassen erstellt.
In C# verwende ich den System.Web.Script.Serialization.JavaScriptSerializer (aus der System.Web.Extensions lib) um die Klasse zu de-/serialisieren und in Java verwende ich com.thoughtworks.xstream.XStream und com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver für das Selbe.
Nun hab ich das Problem, dass mit der C# Serializer ein anderes Format ausspuckt als der XStream Parser lesen kann:
C# generiet:
In Java die gleiche Klasse serialisiert sieht aber so aus:
Die Klasse selbst ist nicht weiter als:
(pseudocode)
In C# ist das KeyValue Object ein Dictionary<string, object> und in Java eine HashMap<String, Object>.
Wie man nun unschwer erkennen kann, kann man dem Java Deserializer die serialisierte C# Klasse nicht füttern, da dieser auf die Nase fällt. Das Problem mit dem {"command":-Teil hab ich gelöst, indem ich ihn einfach direkt als String anhänge, so kann der Java Deserializer wenigstens herausfinden um welche Klasse es sich handelt (ist zwar nicht schön, aber es hilft).
Meine Frage ist nun, wie kann ich die beiden JSON Serializer die gleiche Sprache sprechen lassen?
Ich versuche gerade ein C# und ein Javaprogramm mittels JSON über Sockets kommunizieren zu lassen. Dafür habe ich in C# und in Java zwei identische Klassen erstellt.
In C# verwende ich den System.Web.Script.Serialization.JavaScriptSerializer (aus der System.Web.Extensions lib) um die Klasse zu de-/serialisieren und in Java verwende ich com.thoughtworks.xstream.XStream und com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver für das Selbe.
Nun hab ich das Problem, dass mit der C# Serializer ein anderes Format ausspuckt als der XStream Parser lesen kann:
C# generiet:
Code:
{"Action":"Login","Parameters":{"Username":"asdf","Password":"wasd"}}
Code:
{"command":{"Action":"Login","Parameters":{"entry":[{"string":["Password","wasd"]},{"string":["Username","asdf"]}]}}}
Die Klasse selbst ist nicht weiter als:
(pseudocode)
Code:
class Command
{
public string Action = "Login";
public KeyValue<String,Object> Parameters = { [ "Username", "asdf" ] , [ "Password", "wasd" ] };
}
In C# ist das KeyValue Object ein Dictionary<string, object> und in Java eine HashMap<String, Object>.
Wie man nun unschwer erkennen kann, kann man dem Java Deserializer die serialisierte C# Klasse nicht füttern, da dieser auf die Nase fällt. Das Problem mit dem {"command":-Teil hab ich gelöst, indem ich ihn einfach direkt als String anhänge, so kann der Java Deserializer wenigstens herausfinden um welche Klasse es sich handelt (ist zwar nicht schön, aber es hilft).
Meine Frage ist nun, wie kann ich die beiden JSON Serializer die gleiche Sprache sprechen lassen?
Zuletzt bearbeitet: