/**
   * This method writes this object of <code>ApplicationStateDetails</code> to the specified output
   * stream object.
   *
   * @param out DataOutput object
   * @param versionNo
   * @throws IOException if an error occurs while converting data and writing it to a binary stream.
   * @since Tifosi2.0
   */
  public void toStream(DataOutput out, int versionNo) throws IOException {
    super.toStream(out, versionNo);

    out.writeLong(m_launchTime);
    out.writeLong(m_killTime);
    writeUTF(out, m_strAppGUID);
    writeUTF(out, m_strAppVersion);
    out.writeInt(m_serviceStates.size());

    Enumeration enums = m_serviceStates.keys();

    while (enums.hasMoreElements()) {
      String instName = (String) enums.nextElement();
      ServiceInstanceStateDetails status =
          (ServiceInstanceStateDetails) m_serviceStates.get(instName);

      UTFReaderWriter.writeUTF(out, instName);
      status.toStream(out, versionNo);
    }

    out.writeInt(m_serviceExceptionTraces.size());

    Enumeration traceEnums = m_serviceExceptionTraces.keys();

    while (traceEnums.hasMoreElements()) {
      String instName = (String) traceEnums.nextElement();
      String trace = (String) m_serviceExceptionTraces.get(instName);

      UTFReaderWriter.writeUTF(out, instName);
      UTFReaderWriter.writeUTF(out, trace);
    }

    out.writeInt(m_debugRoutes.size());
    Iterator debugRoutes = getDebugRoutes();

    while (debugRoutes.hasNext()) {
      String routeGUID = (String) debugRoutes.next();
      UTFReaderWriter.writeUTF(out, routeGUID);
    }

    out.writeInt(m_pendingDebugRoutesForClosure.size());
    Iterator pendingDebugRoutesForClosure = getPendingDebugRoutesForClosure();

    while (pendingDebugRoutesForClosure.hasNext()) {
      String routeGUID = (String) pendingDebugRoutesForClosure.next();
      UTFReaderWriter.writeUTF(out, routeGUID);
    }

    out.writeInt(m_previousSyncPeers.size());
    Iterator previousSynchPeers = getPreviousSynchPeers();
    while (previousSynchPeers.hasNext()) {
      String peerName = (String) previousSynchPeers.next();
      UTFReaderWriter.writeUTF(out, peerName);
    }
  }