Как вы можете эмулировать сериализацию объектов на Java в C # - PullRequest
2 голосов
/ 21 декабря 2010

Мне нужно вызвать вызов сервлета для автоматизации Java-апплета с использованием c #. Что такое Java-апплет, так это то, что он называет сервлет, используя объект подключения 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? Есть ли обходной путь здесь? Согласно документации ObjectOutputStream в Java, он сериализует объект за исключением примитивного типа. Я знаю, что String - это класс, так что он сериализует его как объект или какой-то особый случай?

Я попробовал одно решение, я импортировал виртуальную машину Java 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 ]

1 голос
/ 21 декабря 2010

Мне наконец-то удалось заставить это работать.

Проблема заключается в чтении данных в .NET вместо использования StreamReader, мне нужно немедленно использовать объект Stream.В любом случае, просто оставив это здесь на случай, если это поможет другим с их проблемой:

Неправильный код:

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);
}
1 голос
/ 21 декабря 2010

Если вы контролируете сериализацию / десериализацию на стороне Java, лучше всего использовать межплатформенный протокол сериализации, такой как буфер протоколов.Для C ++, Java и Python:

http://code.google.com/p/protobuf/

Для .NET Джон Скит написал порт:

http://code.google.com/p/protobuf-net/

...