Как вы можете подражать сериализации объектов на Java в C#
-
12-10-2019 - |
Вопрос
Мне нужно позвонить в сервенс для автоматизации апплета Java, используя C#. Что такое Java Applet, он вызывает сервлета, используя объект 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();
Проблема в том, что мне нужно моделировать это, используя C#. Я считаю, что объектом аналога будет 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();
Как написать строку как сериализованную Java String? Здесь есть обходной путь? Согласно документации ObjectOutputStream в Java, он сериализует объект, за исключением примитивного типа. Я знаю, что String - это класс, так что он последовательно, как объект или какой -то особый случай?
Я попробовал одно решение, я импортировал виртуальную машину IKVM (http://www.ikvm.net/) в моей ссылке и пытаюсь использовать библиотеку Java.io в Java. Несмотря на то, что когда называется конструктор ObjectInputStream, брошен «неверный заголовок потока».
Вот мой измененный код:
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)
Решение 2
Я наконец -то должен заставить это работать.
Проблема заключается в чтении данных в .net вместо использования StreamReader, мне нужно немедленно использовать объект потока. В любом случае, просто оставив его здесь на случай, если это поможет другим с их проблемой:
Неправильный код:
List<byte> lByte = new List<byte>();
using (StreamReader sr = new StreamReader(myRequest.GetResponse().GetResponseStream()))
{
while (sr.Peek() >= 0)
{
lByte.Add((byte)sr.Read());
}
}
Правильный код:
byte[] buffer = new byte[1000];
using (Stream sr = myRequest.GetResponse().GetResponseStream())
{
sr.Read(buffer, 0, 1000);
}
Другие советы
Если у вас есть контроль над сериализацией/десериализацией со стороны Java, лучше всего использовать протокол сериализации кроссплатформенной сериализации, такой как буферы протокола. Для C ++, Java и Python:
http://code.google.com/p/protobuf/
Для .net Джон Скит написал порт: