public void saveXml(Writer fwrite) throws IOException {
		fwrite.append("<exe");
		if (isLibrary()) {
			fwrite.append(" library=\"true\"");
		}
		fwrite.append(">\n");
		fwrite.append("  <md5>").append(md5sum).append("</md5>\n");
		fwrite.append("  <name>");
		SpecXmlUtils.xmlEscapeWriter(fwrite, executableName);
		fwrite.append("</name>\n");
		fwrite.append("  <arch>");
		SpecXmlUtils.xmlEscapeWriter(fwrite, architecture);
		fwrite.append("</arch>\n");
		fwrite.append("  <compiler>");
		SpecXmlUtils.xmlEscapeWriter(fwrite, compilerName);
		fwrite.append("</compiler>\n");
		long seconds = date.getTime();
		final long millis = seconds % 1000;
		seconds /= 1000;
		fwrite.append("  <date millis=\"")
				.append(SpecXmlUtils.encodeUnsignedInteger(millis))
				.append("\">");
		fwrite.append(SpecXmlUtils.encodeUnsignedInteger(seconds));
		fwrite.append("</date>\n");
		if (repository != null) {
			fwrite.append("  <repository>");
			SpecXmlUtils.xmlEscapeWriter(fwrite, repository);
			fwrite.append("</repository>\n");
		}
		if (path != null) {
			fwrite.append("  <path>");
			SpecXmlUtils.xmlEscapeWriter(fwrite, path);
			fwrite.append("</path>\n");
		}

		if (usercat != null) {
			for (CategoryRecord element : usercat) {
				element.saveXml(fwrite);
			}
		}
		fwrite.append("</exe>\n");
	}
Serialize this executable (meta-data) to an XML stream
@param fwrite is the XML stream
@throws IOException if there are I/O errors writing to the stream
Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/description/ExecutableRecord.java