Problema no ObjectOutputStream

Eu tenho este exemplo, mas o último println que obtenho é o 3. Logo, o programa parece que fica bloqueado na linha oostr.writeObject(obj);.

O Object obj contém informação. Ou seja, não é null.

Alguém tem sugestões?

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletResponse;

public class ServletUtil {
  
  /**
   * Create a HTTP servlet response from the given result object.
   * The given object is serialized into the response output stream.
   * @param resp the HTTP servlet response to be filled
   * @param obj the object to be transmitted in the HTTP servlet response
   * @throws IOException in case of stream henaling / serialization problems
   */
  public static void createResponse(HttpServletResponse resp, Object obj) throws IOException {

    final String contentType = "application/x-java-serialized-object";
    resp.setContentType(contentType);

    // Serialize obj into a byte array stream first so that we can determine
    // the length - setting Content-Length is a precondition for HTTP keep-alive.
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    System.out.println("1");
    ObjectOutputStream oostr = new ObjectOutputStream(bos);
    System.out.println("2");
    OutputStream os = resp.getOutputStream();
    System.out.println("3");
    oostr.writeObject(obj);
    System.out.println("4");
    int contentLength = bos.size();
    System.out.println("5");
    resp.setContentLength(contentLength);
    System.out.println("6");
    
    bos.writeTo(os);
    System.out.println("7");
    bos.flush();
    System.out.println("8");
    bos.close();
    System.out.println("9");
    oostr.close();
    System.out.println("10");
    os.close();
    System.out.println("11");
    System.out.println("RESP.TOSTRING(): " + resp.toString());
  }

}

Obrigado

Se obj não implementar corretamente Serializable, haverá uma Exception na tal linha “oostr.writeObject(obj);”

Ou seja, a classe desse objeto deve “implements Serializable”, mas todos os membros dessa classe também devem “implements Serializable”, ou então serem tipos primitivos ou String. É algo que pode dar problemas porque basta apenas um membro não implementar corretamente isso para dar problemas.

O obj que entra no método como parâmetro é Serializable e contém atributos do tipo int, boolean, String e HashMap. Logo, os atributos também são serializable.

Já descobri. O HashMap guarda objectos(classes) que usam o log4j, através da classe Logger. O Logger não é serializable.

Obrigado pela dica thingol.

Essas classes que usam o log4j podem referir-se a ele usando variáveis estáticas ou “transient”, como:

private transient Logger logger = …;

membros transientes não são serializáveis - e de modo geral, tente deixar o máximo de membros marcados com “transient”, se eles não precisarem ser serializados (por exemplo, porque são imediatamente calculáveis a partir de outros membros).