/// <summary> /// Deserialize xml/string to blocks with entities /// </summary> /// <param name="container"></param> /// <param name="serialized"></param> /// <returns>Optional, only required for SerializationType: Text</returns> public ShuffleBlocks Deserialize(IExecutionContainer container, XmlDocument serialized) { container.StartSection("Deserialize"); var result = new ShuffleBlocks(); if (serialized != null) { var root = XML.FindChild(serialized, "ShuffleData"); var sertype = XML.GetAttribute(root, "Type"); SendLine(container, $"Deserialize from {sertype}"); if (sertype == SerializationType.Full.ToString() || sertype == SerializationType.Simple.ToString() || sertype == SerializationType.SimpleNoId.ToString() || sertype == SerializationType.SimpleWithValue.ToString() || sertype == SerializationType.Explicit.ToString()) { foreach (XmlNode xBlock in root.ChildNodes) { if (xBlock.NodeType == XmlNodeType.Element && xBlock.Name == "Block" && xBlock.ChildNodes.Count == 1) { var name = XML.GetAttribute(xBlock, "Name"); var xml = new XmlDocument(); xml.AppendChild(xml.ImportNode(xBlock.ChildNodes[0], true)); var cEntities = container.CreateEntityCollection(xml); SendLine(container, $"Block {name}: {cEntities.Count()} records"); result.Add(name, cEntities); } } } else if (sertype == SerializationType.Text.ToString()) { var strdelimeter = XML.GetAttribute(root, "Delimeter"); var delimeter = strdelimeter.Length == 1 ? strdelimeter[0] : '\t'; var xText = XML.FindChild(root, "Text"); var reader = new StringReader(xText.InnerText); var line = 0; var name = ""; StringBuilder serializedblock = null; var current = reader.ReadLine(); while (current != null) { container.Log("Line {0:000}: {1}", line, current); if (current.StartsWith("<<<") && current.Contains(">>>")) { container.Log("Block start"); if (!string.IsNullOrWhiteSpace(name) && serializedblock != null) { var cEntities = container.CreateEntityCollection(serializedblock.ToString(), delimeter); result.Add(name, cEntities); SendLine(container, $"Block {name}: {cEntities.Count()} records"); } name = current.Substring(3); name = name.Substring(0, name.IndexOf(">>>", StringComparison.Ordinal)); serializedblock = new StringBuilder(); } else { serializedblock.AppendLine(current); } current = reader.ReadLine(); line++; } if (!string.IsNullOrWhiteSpace(serializedblock.ToString())) { var cEntities = container.CreateEntityCollection(serializedblock.ToString(), delimeter); result.Add(name, cEntities); SendLine(container, $"Block {name}: {cEntities.Count()} records"); } } } container.EndSection(); return(result); }