docs: private Deferred<ChannelBuffer> serialize() throws Exception {
      final long start = System.currentTimeMillis();
      // buffers and an array list to stored the deferreds
      final ChannelBuffer response = ChannelBuffers.dynamicBuffer();
      final OutputStream output_stream = new ChannelBufferOutputStream(response);
  
      final JsonGenerator json = JSON.getFactory().createGenerator(output_stream);
      json.writeStartObject();
      json.writeFieldName("outputs");
      json.writeStartArray();
  
      // We want the serializer to execute serially so we need to create a callback
      // chain so that when one DPsResolver is finished, it triggers the next to
      // start serializing.
      final Deferred<Object> cb_chain = new Deferred<Object>();
  
      // default to the expressions if there, or fall back to the metrics
      final List<Output> outputs;
      if (query.getOutputs() == null || query.getOutputs().isEmpty()) {
        if (query.getExpressions() != null && !query.getExpressions().isEmpty()) {
          outputs = new ArrayList<Output>(query.getExpressions().size());
          for (final Expression exp : query.getExpressions()) {
            outputs.add(Output.Builder().setId(exp.getId()).build());
          }
        } else if (query.getMetrics() != null && !query.getMetrics().isEmpty()) {
          outputs = new ArrayList<Output>(query.getMetrics().size());
          for (final Metric metric : query.getMetrics()) {
            outputs.add(Output.Builder().setId(metric.getId()).build());
          }
        } else {
          throw new IllegalArgumentException(
              "How did we get here?? No metrics or expressions??");
        }
      } else {
        outputs = query.getOutputs();
      }
  
      for (final Output output : outputs) {
        if (expressions != null) {
          final ExpressionIterator it = expressions.get(output.getId());
          if (it != null) {
            cb_chain.addCallback(new SerializeExpressionIterator(tsdb, json, 
                output, it, ts_query));
            continue;
          }
        }
  
        if (query.getMetrics() != null && !query.getMetrics().isEmpty()) {
          final TSSubQuery sub = sub_queries.get(output.getId());
          if (sub != null) {
            final TimeSyncedIterator it = new TimeSyncedIterator(output.getId(), 
                sub.getFilterTagKs(), sub_query_results.get(output.getId()));
            cb_chain.addCallback(new SerializeSubIterator(tsdb, json, output, it));
            continue;
          }
        } else {
          LOG.warn("Couldn't find a variable matching: " + output.getId() + 
              " in query " + query);
        }
      }
    
      /** Final callback to close out the JSON array and return our results */
      class FinalCB implements Callback<ChannelBuffer, Object> {
        public ChannelBuffer call(final Object obj)
            throws Exception {
          json.writeEndArray();
          
  //        ts_query.getQueryStats().setTimeSerialization(
  //            DateTime.currentTimeMillis() - start);
          ts_query.getQueryStats().markSerializationSuccessful();
  
          // dump overall stats as an extra object in the array
  //        if (true) {
  //          final QueryStats stats = ts_query.getQueryStats();
  //          json.writeFieldName("statsSummary");
  //          json.writeStartObject();
  //          //json.writeStringField("hostname", TSDB.getHostname());
  //          //json.writeNumberField("runningQueries", stats.getNumRunningQueries());
  //          json.writeNumberField("datapoints", stats.getAggregatedSize());
  //          json.writeNumberField("rawDatapoints", stats.getSize());
  //          //json.writeNumberField("rowsFetched", stats.getRowsFetched());
  //          json.writeNumberField("aggregationTime", stats.getTimeAggregation());
  //          json.writeNumberField("serializationTime", stats.getTimeSerialization());
  //          json.writeNumberField("storageTime", stats.getTimeStorage());
  //          json.writeNumberField("timeTotal", 
  //              ((double)stats.getTimeTotal() / (double)1000000));
  //          json.writeEndObject();
  //        }
          
          // dump the original query
          if (true) {
            json.writeFieldName("query");
            json.writeObject(QueryExecutor.this.query);
          }
          // IMPORTANT Make sure the close the JSON array and the generator
          json.writeEndObject();
          json.close();
          return response;
        }
      }
  
      // trigger the callback chain here
      cb_chain.callback(null);
      return cb_chain.addCallback(new FinalCB());
    }