private void WriteNode(object node) { writer.WriteNode(Serialization.GetNodeName(node)); WriteAttributes(node); writer.WriteEndAttributes(); WriteChildren(node); }
private object ReadNode() { var name = reader.ReadString(); var node = Serialization.CreateNode(name); var folder = node as Folder; if (folder != null) { folder.Name = name; } reader.ReadStringArray(attributes); SetAttributes(node); int childrenCount = reader.ReadInt32(); if (childrenCount > 0) { if (!(node is TreeNode)) { // OK we got ourselves into a situation here. // https://github.com/KirillOsenkov/MSBuildStructuredLog/issues/242 // There's a design flaw in the BuildLog format. I took a shortcut // and for Folder nodes I just write the name of the folder instead // of specifying that the element is a Folder in the first place. // Unfortunately I didn't think about Folders named "Property", // "Target", etc. // So the deserialization logic when it sees a string called "Property" // it assumes we have a property here, instead of a Folder named // "Property". But properties have children! We're in a pickle now. // Longer term I need to modify the format to not do this optimization // and always write "Folder" for folders and write the name separately. // For now I don't have time to do this right, so put in the dirty // hack to recover from this situation. If it says it's a "Property" // but expects children, it means it's actually a folder with name // "Property". folder = new Folder(); folder.Name = Serialization.GetNodeName(node); node = folder; } var treeNode = (TreeNode)node; for (int i = 0; i < childrenCount; i++) { var child = ReadNode(); treeNode.AddChild(child); } } if (node is Build build && formatSupportsEmbeddedProjectImportsArchive) { build.SourceFilesArchive = reader.ReadByteArray(); } return(node); }
private void WriteNode(BaseNode node) { var elementName = Serialization.GetNodeName(node); xmlWriter.WriteStartElement(elementName); try { var metadata = node as Metadata; if (metadata != null) { SetString(nameof(Metadata.Name), metadata.Name); WriteContent(metadata.Value); return; } var property = node as Property; if (property != null) { SetString(nameof(Property.Name), property.Name); WriteContent(property.Value); return; } var message = node as Message; if (message != null) { if (message.IsLowRelevance) { SetString(nameof(message.IsLowRelevance), "true"); } SetString(nameof(Message.Timestamp), ToString(message.Timestamp)); WriteContent(message.Text); return; } var treeNode = node as TreeNode; WriteAttributes(treeNode); if (treeNode.HasChildren) { foreach (var child in treeNode.Children) { WriteNode(child); } } } finally { xmlWriter.WriteEndElement(); } }
private void WriteNode(object node) { writer.WriteNode(Serialization.GetNodeName(node)); WriteAttributes(node); writer.WriteEndAttributes(); WriteChildren(node); if (node is Build build) { writer.WriteByteArray(build.SourceFilesArchive); } }