ConstructorCallExpression bytes = new ConstructorCallExpression(BAIS_TYPE, new TupleExpression(new MethodCallExpression(baos, "toByteArray", MethodCallExpression.NO_ARGUMENTS)));
body.addStatement(new ExpressionStatement(new DeclarationExpression(bais, ASSIGN, bytes)));
// return bais.withObjectInputStream(getClass().classLoader){ it.readObject() }
BlockStatement readClosureCode = new BlockStatement();
readClosureCode.addStatement(new ExpressionStatement(new MethodCallExpression(it, "readObject", MethodCallExpression.NO_ARGUMENTS)));
ClosureExpression readClosure = new ClosureExpression(new Parameter[]{}, readClosureCode);
readClosure.setVariableScope(new VariableScope());
Expression klass = new MethodCallExpression(VariableExpression.THIS_EXPRESSION, "getClass", MethodCallExpression.NO_ARGUMENTS);
Expression classLoader = new MethodCallExpression(klass, "getClassLoader", MethodCallExpression.NO_ARGUMENTS);
Expression result = new MethodCallExpression(bais, "withObjectInputStream", new ArgumentListExpression(classLoader, readClosure));