возврат объекта с помощью ObjectOutputStream

#java #objectoutputstream

#java #objectoutputstream

Вопрос:

Я нашел фрагмент кода Java, который, как утверждается, возвращает объект с помощью ObjectOutputStream

      OutputStream outstr = response.getOutputStream();
     ObjectOutputStream oos = new ObjectOutputStream(outstr);

     oos.writeObject(process);

     oos.flush();
     oos.close();
  

ответом является объект HttpServletResponse. Я хотел бы знать, как работает этот сегмент кода и как его протестировать?

Ответ №1:

Ниже приведен простой пример, который показывает, как прочитать сериализованный объект через HTTP.

 import java.net.URL;
import java.net.HttpURLConnection;
import java.io.ObjectInputStream;

/**
 * This is a simple example to read an object. 
 *
 * This is not production ready code ;-)
 */
public class Sample {

    public static void main(final String [] pArgs) throws Exception {

        // Change SERVER:PORT/PATH to match your application.
        final URL url = new URL("http://SERVER:PORT/PATH");
        final HttpURLConnection conn = (HttpURLConnection)url.openConnection();

        conn.setRequestMethod("GET");
        conn.setReadTimeout(10000);
        conn.connect();

        final ObjectInputStream is 
        = new ObjectInputStream(conn.getInputStream());

        final Object obj = is.readObject();

        if (obj instanceof String) System.out.println((String)obj);
        else // Convert to object and do whatever.

        is.close();
        conn.disconnect();
    }
}
  

Ответ №2:

Он сериализует объект в выходной поток сервлета (например, данные, которые будут переданы в HTTP-ответе), используя протокол двоичной сериализации Java по умолчанию (который я лично несколько неохотно использую). Для получения подробной информации смотрите спецификацию сериализации объектов.

Что касается способа его тестирования — это зависит от уровня тестирования, который вы хотите использовать. Вы могли бы использовать поддельную библиотеку HTTP-сервлетов, получить ответ, а затем попытаться прочитать его снова с помощью ObjectInputStream , или вы могли бы запустить фактический контейнер сервлета, выполнить HTTP-запрос, а затем попытаться десериализовать ответ.