public void Write(Stream stream) { _visitor = new RecordVisitor(); _visitor.Run(ScopeDefinitions.AsEnumerable()); _visitor.Run(AdditionalRootRecords.AsEnumerable()); IEnumerable <MetadataRecord> records = _visitor.Graph.Vertices.Where(v => v != _visitor.MetaSourceVertex); var writer = new NativeWriter(); var section = writer.NewSection(); _metadataHeader.ScopeDefinitions = ScopeDefinitions; section.Place(_metadataHeader); foreach (var rec in records) { section.Place(rec); } writer.Save(stream); if (LogWriter != null) { // Create a CSV file, one line per meta-data record. LogWriter.WriteLine("Handle, Kind, Name, Children"); // needed to enumerate children of a meta-data record var childVisitor = new WriteChildrenVisitor(LogWriter); foreach (var rec in records) { // First the metadata handle LogWriter.Write(rec.Handle._value.ToString("x8")); LogWriter.Write(", "); // Next the handle type LogWriter.Write(rec.HandleType.ToString()); LogWriter.Write(", "); // 3rd, the name, Quote the string if not already quoted string asString = rec.ToString(false); bool alreadyQuoted = asString.StartsWith("\"") && asString.EndsWith("\""); if (!alreadyQuoted) { LogWriter.Write("\""); asString = asString.Replace("\\", "\\\\").Replace("\"", "\\\""); // Quote " and \ } // TODO we assume that a quoted string is escaped properly LogWriter.Write(asString); if (!alreadyQuoted) { LogWriter.Write("\""); } LogWriter.Write(", "); // Finally write out the handle IDs for my children LogWriter.Write("\""); childVisitor.Reset(); rec.Visit(childVisitor); LogWriter.Write("\""); LogWriter.WriteLine(); } LogWriter.Flush(); } }