@Override
 protected void dehydrateValues() {
   TCByteBufferOutputStream outputStream = getOutputStream();
   // We don't want to use the NVpair stuff:  it is horrendously complicated, doesn't work well
   // with all types, and doesn't buy us anything.
   putNVPair(RECEIVED_ID, receivedIDs != null ? receivedIDs.size() : 0);
   if (receivedIDs != null) {
     for (TransactionID tid : receivedIDs) {
       outputStream.writeLong(tid.toLong());
     }
   }
   putNVPair(TRANSACTION_ID, retiredIDs != null ? retiredIDs.size() : 0);
   if (retiredIDs != null) {
     for (TransactionID tid : retiredIDs) {
       outputStream.writeLong(tid.toLong());
     }
   }
   putNVPair(RESULTS_ID, results != null ? results.size() : 0);
   if (results != null) {
     for (Map.Entry<TransactionID, byte[]> entries : results.entrySet()) {
       outputStream.writeLong(entries.getKey().toLong());
       outputStream.writeInt(entries.getValue().length);
       outputStream.write(entries.getValue());
     }
   }
 }