Come è possibile emulare serializzazione degli oggetti su Java in C #
-
12-10-2019 - |
Domanda
ho bisogno di chiamare una chiamata servlet per l'automazione di un applet Java utilizzando c #. Che l'applet Java è che definisce un servlet utilizzando un oggetto Connection URL.
URL servlet = new URL(servletProtocol, servletHost, servletPort, "/" + ServletName);
URLConnection con = servlet.openConnection();
con.setDoOutput(true);
ObjectOutputStream out = new ObjectOutputStream(con.getOutputStream());
// Write several parameters strings
out.writeObject(param[0]);
out.writeObject(param[1]);
out.flush();
out.close();
Il problema è che ho bisogno di simulare questo utilizzando c #. Credo che l'oggetto controparte sarebbe HttpWebRequest
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(servletPath);
myRequest.Method = "POST";
myRequest.ContentType="application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
Stream newStream=myRequest.GetRequestStream();
// Send the data.
newStream.Write(param[0],0,param[0].length);
newStream.Write(param[1],0,param[1].length);
newStream.Close();
Come faccio a scrivere la stringa come una stringa Java serializzato? C'è qualche soluzione qui? Secondo la documentazione di ObjectOutputStream in Java, serializzare l'oggetto ad eccezione di tipo primitivo. So String è di classe, quindi vuol serialzie è come un oggetto o di qualche caso particolare?
ho cercato una soluzione, ho importato il Java Virtual Machine IKVM (http://www.ikvm.net/) nel mio riferimento e sto cercando di utilizzare la libreria java.io in Java. Unforunately, quando il costruttore ObjectInputStream si chiama, "un colpo di testa flusso non valido" è gettato.
Ecco il mio codice alterato:
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
Stream newStream = myRequest.GetRequestStream();
// Send the data.
newStream.Write(data, 0, data.Length);
newStream.Close();
List<byte> lByte = new List<byte>();
using (StreamReader sr = new StreamReader(myRequest.GetResponse().GetResponseStream()))
{
while (sr.Peek() >= 0)
{
lByte.Add((byte)sr.Read());
}
}
byte[] bArr = lByte.ToArray();
ObjectInputStream inputStream = null;
try
{
//Construct the ObjectInputStream object
inputStream = new ObjectInputStream(new ByteArrayInputStream(bArr));
Object obj = null;
while ((obj = inputStream.readObject()) != null)
{
string objStr = obj as string;
}
}
catch (java.lang.Exception ex)
Soluzione 2
Alla fine ho avuto modo di ottenere questo al lavoro.
Il problema è sulla lettura dei dati in .NET invece di utilizzare StreamReader, ho bisogno di usare l'oggetto Stream immediatamente. Comunque appena lasciato qui nel caso in cui aiuta gli altri con il loro problema:
Codice errato:
List<byte> lByte = new List<byte>();
using (StreamReader sr = new StreamReader(myRequest.GetResponse().GetResponseStream()))
{
while (sr.Peek() >= 0)
{
lByte.Add((byte)sr.Read());
}
}
Una corretta Codice:
byte[] buffer = new byte[1000];
using (Stream sr = myRequest.GetResponse().GetResponseStream())
{
sr.Read(buffer, 0, 1000);
}
Altri suggerimenti
Se si ha il controllo sulla serializzazione / deserializzazione sul lato Java, la cosa migliore è quello di utilizzare un protocollo di serializzazione cross-piattaforma come buffer protocollo. Per C ++, Java e Python:
http://code.google.com/p/protobuf/
Per .NET, Jon Skeet ha scritto una porta: