code: public static <T> T withObjectStreams(Socket socket, @ClosureParams(value=SimpleType.class, options={"java.io.ObjectInputStream","java.io.ObjectOutputStream"}) Closure<T> closure) throws IOException {
          InputStream input = socket.getInputStream();
          OutputStream output = socket.getOutputStream();
          ObjectOutputStream oos = new ObjectOutputStream(output);
          ObjectInputStream ois = new ObjectInputStream(input);
          try {
              T result = closure.call(new Object[]{ois, oos});
  
              InputStream temp1 = ois;
              ois = null;
              temp1.close();
              temp1 = input;
              input = null;
              temp1.close();
              OutputStream temp2 = oos;
              oos = null;
              temp2.close();
              temp2 = output;
              output = null;
              temp2.close();
  
              return result;
          } finally {
              closeWithWarning(ois);
              closeWithWarning(input);
              closeWithWarning(oos);
              closeWithWarning(output);
          }
      }
docs: Creates an InputObjectStream and an OutputObjectStream from a Socket, and
  passes them to the closure.  The streams will be closed after the closure
  returns, even if an exception is thrown.
  
  @param socket  this Socket
  @param closure a Closure
  @return the value returned by the closure
  @throws IOException if an IOException occurs.
  @since 1.5.0