using System.Collections.Generic;
using System.Xml.Serialization;
[XmlRoot(ElementName="Component")]
[XmlElement(ElementName="ActCapacity")]
public string ActCapacity { get; set; }
[XmlElement(ElementName="ActDosingPercentage")]
public string ActDosingPercentage { get; set; }
[XmlElement(ElementName="BandNumber")]
public string BandNumber { get; set; }
[XmlElement(ElementName="Consumption")]
public string Consumption { get; set; }
[XmlElement(ElementName="Material")]
public string Material { get; set; }
[XmlElement(ElementName="CorrectionFactor")]
public string CorrectionFactor { get; set; }
[XmlElement(ElementName="EventCodes")]
public string EventCodes { get; set; }
[XmlElement(ElementName="GranulateType")]
public string GranulateType { get; set; }
[XmlElement(ElementName="MeasurementTime")]
public string MeasurementTime { get; set; }
[XmlElement(ElementName="ActDosingWeight")]
public string ActDosingWeight { get; set; }
[XmlElement(ElementName="SetDosingWeight")]
public string SetDosingWeight { get; set; }
[XmlElement(ElementName="MaxEventType")]
public string MaxEventType { get; set; }
[XmlElement(ElementName="PumpType")]
public string PumpType { get; set; }
[XmlElement(ElementName="PumpSize")]
public string PumpSize { get; set; }
[XmlElement(ElementName="RegrindFillLevel")]
public string RegrindFillLevel { get; set; }
[XmlElement(ElementName="RegrindPercentage")]
public string RegrindPercentage { get; set; }
[XmlElement(ElementName="SetCapacity")]
public string SetCapacity { get; set; }
[XmlElement(ElementName="SetDosingPercentage")]
public string SetDosingPercentage { get; set; }
[XmlElement(ElementName="Tolerance")]
public string Tolerance { get; set; }
[XmlElement(ElementName="ValveType")]
public string ValveType { get; set; }
[XmlAttribute(AttributeName="Index")]
public string Index { get; set; }
[XmlAttribute(AttributeName="Name")]
public string Name { get; set; }
[XmlAttribute(AttributeName="Type")]
public string Type { get; set; }
[XmlRoot(ElementName="Unit")]
[XmlElement(ElementName="ActMotorSpeed")]
public string ActMotorSpeed { get; set; }
[XmlElement(ElementName="BatchCounter")]
public string BatchCounter { get; set; }
[XmlElement(ElementName="BatchWeight")]
public string BatchWeight { get; set; }
[XmlElement(ElementName="DosingMode")]
public string DosingMode { get; set; }
[XmlElement(ElementName="DosingTool")]
public string DosingTool { get; set; }
[XmlElement(ElementName="EventCodes")]
public string EventCodes { get; set; }
[XmlElement(ElementName="GrossWeight")]
public string GrossWeight { get; set; }
[XmlElement(ElementName="MaxEventType")]
public string MaxEventType { get; set; }
[XmlElement(ElementName="SetMotorSpeed")]
public string SetMotorSpeed { get; set; }
[XmlElement(ElementName="Status")]
public string Status { get; set; }
[XmlElement(ElementName="Component")]
public Component Component { get; set; }
[XmlAttribute(AttributeName="Index")]
public string Index { get; set; }
[XmlAttribute(AttributeName="Name")]
public string Name { get; set; }
[XmlAttribute(AttributeName="Type")]
public string Type { get; set; }
[XmlRoot(ElementName="Group")]
[XmlElement(ElementName="ActDosingTime")]
public string ActDosingTime { get; set; }
[XmlElement(ElementName="SetDosingTime")]
public string SetDosingTime { get; set; }
[XmlElement(ElementName="ActTachoVoltage")]
public string ActTachoVoltage { get; set; }
[XmlElement(ElementName="SetTachoVoltage")]
public string SetTachoVoltage { get; set; }
[XmlElement(ElementName="ShotWeight")]
public string ShotWeight { get; set; }
[XmlElement(ElementName="ActExtruderCapacity")]
public string ActExtruderCapacity { get; set; }
[XmlElement(ElementName="SetExtruderCapacity")]
public string SetExtruderCapacity { get; set; }
[XmlElement(ElementName="ActExtruderSpeed")]
public string ActExtruderSpeed { get; set; }
[XmlElement(ElementName="SetExtruderSpeed")]
public string SetExtruderSpeed { get; set; }
[XmlElement(ElementName="ActWeightCapacity")]
public string ActWeightCapacity { get; set; }
[XmlElement(ElementName="Consumption")]
public string Consumption { get; set; }
[XmlElement(ElementName="EventCodes")]
public string EventCodes { get; set; }
[XmlElement(ElementName="MaxEventType")]
public string MaxEventType { get; set; }
[XmlElement(ElementName="Unit")]
public List<Unit> Unit { get; set; }
[XmlAttribute(AttributeName="Index")]
public string Index { get; set; }
[XmlAttribute(AttributeName="Name")]
public string Name { get; set; }
[XmlRoot(ElementName="MachineLog")]
public class MachineLog {
[XmlElement(ElementName="Active")]
public string Active { get; set; }
[XmlElement(ElementName="ActLineSpeed")]
public string ActLineSpeed { get; set; }
[XmlElement(ElementName="ActProductWeight")]
public string ActProductWeight { get; set; }
[XmlElement(ElementName="EventCodes")]
public string EventCodes { get; set; }
[XmlElement(ElementName="HasLineControl")]
public string HasLineControl { get; set; }
[XmlElement(ElementName="InputType")]
public string InputType { get; set; }
[XmlElement(ElementName="MaxEventType")]
public string MaxEventType { get; set; }
[XmlElement(ElementName="OrderNumber")]
public string OrderNumber { get; set; }
[XmlElement(ElementName="ProductionMode")]
public string ProductionMode { get; set; }
[XmlElement(ElementName="Recipe")]
public string Recipe { get; set; }
[XmlElement(ElementName="SetLineCapacity")]
public string SetLineCapacity { get; set; }
[XmlElement(ElementName="SetLineSpeed")]
public string SetLineSpeed { get; set; }
[XmlElement(ElementName="SetProductWeight")]
public string SetProductWeight { get; set; }
[XmlElement(ElementName="ActTotalExtruderCapacity")]
public string ActTotalExtruderCapacity { get; set; }
[XmlElement(ElementName="SetTotalExtruderCapacity")]
public string SetTotalExtruderCapacity { get; set; }
[XmlElement(ElementName="Group")]
public List<Group> Group { get; set; }
[XmlAttribute(AttributeName="Name")]
public string Name { get; set; }
[XmlAttribute(AttributeName="Timestamp")]
public string Timestamp { get; set; }
[XmlRoot(ElementName="Machine")]
public abstract class BodyValueBase
[XmlAttribute] public string Version { get; set; }
[XmlRoot(ElementName="AddProcessLog", Namespace="")]
public class AddProcessLog : BodyValueBase
[XmlElement(ElementName="Machine")]
public MachineLog MachineLog { get; set; }
[XmlRoot(ElementName="UpdateStructure", Namespace="")]
public class UpdateStructure : BodyValueBase
[XmlElement(Namespace = "", ElementName = "Machine" )]
public Machine Machine { get; set; }
[XmlRoot(ElementName="Body")]
[XmlElement("AddProcessLog", typeof(AddProcessLog), Namespace="urn:mcsmart:machine")]
[XmlElement("UpdateStructure", typeof(UpdateStructure), Namespace="urn:mcsmart:machine")]
public BodyValueBase BodyValue { get; set; }
[XmlRoot(ElementName="Header")]
[XmlElement(ElementName="Sender")]
public string Sender { get; set; }
[XmlElement(ElementName="MacAddress")]
public string MacAddress { get; set; }
[XmlRoot(ElementName="Envelope")]
[XmlElement(ElementName="Header")]
public Header Header { get; set; }
[XmlElement(ElementName="Body")]
public Body Body { get; set; }
public static void Test()
var envelope = xml.LoadFromXml<Envelope>();
var xml2 = envelope.GetXml();
Console.WriteLine("Re-serialized {0}:", envelope);
XmlAssert.AreEqual(XElement.Parse(xml), XElement.Parse(xml2));
static string GetXml() =>
<MacAddress>00-0C-C6-86-E4-B2</MacAddress>
<m:AddProcessLog xmlns:m="urn:mcsmart:machine" Version="2.1.0">
<Machine Name="MC-TC Nick" Timestamp="1683621447526">
<ActLineSpeed>0.000</ActLineSpeed>
<ActProductWeight>0.000</ActProductWeight>
<HasLineControl>false</HasLineControl>
<InputType>Relay</InputType>
<MaxEventType>None</MaxEventType>
<ProductionMode>Extrusion</ProductionMode>
<SetLineCapacity>-1.000</SetLineCapacity>
<SetLineSpeed>0.125</SetLineSpeed>
<SetProductWeight>1000.000</SetProductWeight>
<ActTotalExtruderCapacity>0.000</ActTotalExtruderCapacity>
<SetTotalExtruderCapacity>0.000</SetTotalExtruderCapacity>
<Group Index="0" Name="Group1">
<ActDosingTime>0.100</ActDosingTime>
<SetDosingTime>0.100</SetDosingTime>
<ActTachoVoltage>0.078</ActTachoVoltage>
<SetTachoVoltage>24.000</SetTachoVoltage>
<ShotWeight>0.100</ShotWeight>
<ActExtruderCapacity>0.000</ActExtruderCapacity>
<SetExtruderCapacity>0.028</SetExtruderCapacity>
<ActExtruderSpeed>0.000</ActExtruderSpeed>
<SetExtruderSpeed>0.000</SetExtruderSpeed>
<ActWeightCapacity>0.000</ActWeightCapacity>
<Consumption>0.000</Consumption>
<MaxEventType>None</MaxEventType>
<Unit Index="0" Name="Unit1" Type="MCPowder">
<ActMotorSpeed>0.000</ActMotorSpeed>
<BatchCounter>0</BatchCounter>
<BatchWeight>0.000</BatchWeight>
<DosingMode>Gravimetric</DosingMode>
<DosingTool>SP15</DosingTool>
<GrossWeight>0.000</GrossWeight>
<MaxEventType>None</MaxEventType>
<SetMotorSpeed>55.000</SetMotorSpeed>
<Component Index="0" Name="Component1" Type="AdditiveV">
<ActCapacity>0.000</ActCapacity>
<ActDosingPercentage>0.000</ActDosingPercentage>
<BandNumber>0</BandNumber>
<Consumption>0.000</Consumption>
<Material>sp15-ng</Material>
<CorrectionFactor>1.000</CorrectionFactor>
<GranulateType>Normal</GranulateType>
<MeasurementTime>0.000</MeasurementTime>
<ActDosingWeight>0.000</ActDosingWeight>
<SetDosingWeight>0.000</SetDosingWeight>
<MaxEventType>None</MaxEventType>
<PumpType>None</PumpType>
<PumpSize>None</PumpSize>
<RegrindFillLevel>0.000</RegrindFillLevel>
<RegrindPercentage>0.000</RegrindPercentage>
<SetCapacity>0.000</SetCapacity>
<SetDosingPercentage>0.000</SetDosingPercentage>
<Tolerance>25.000</Tolerance>
<ValveType>None</ValveType>
<Unit Index="1" Name="Unit2" Type="MCBalance">
<ActMotorSpeed>0.000</ActMotorSpeed>
<BatchCounter>0</BatchCounter>
<BatchWeight>0.000</BatchWeight>
<DosingMode>Gravimetric</DosingMode>
<DosingTool>GLX</DosingTool>
<GrossWeight>0.000</GrossWeight>
<MaxEventType>None</MaxEventType>
<SetMotorSpeed>0.000</SetMotorSpeed>
<Component Index="0" Name="Component2" Type="AdditiveV">
<ActCapacity>0.000</ActCapacity>
<ActDosingPercentage>0.000</ActDosingPercentage>
<BandNumber>0</BandNumber>
<Consumption>0.000</Consumption>
<Material>glx-ng</Material>
<CorrectionFactor>1.000</CorrectionFactor>
<GranulateType>Normal</GranulateType>
<MeasurementTime>432.900</MeasurementTime>
<ActDosingWeight>0.000</ActDosingWeight>
<SetDosingWeight>0.000</SetDosingWeight>
<MaxEventType>None</MaxEventType>
<PumpType>None</PumpType>
<PumpSize>None</PumpSize>
<RegrindFillLevel>0.000</RegrindFillLevel>
<RegrindPercentage>0.000</RegrindPercentage>
<SetCapacity>0.015</SetCapacity>
<SetDosingPercentage>55.000</SetDosingPercentage>
<Tolerance>25.000</Tolerance>
<ValveType>None</ValveType>
<Group Index="1" Name="Group2">
<ActDosingTime>0.100</ActDosingTime>
<SetDosingTime>0.100</SetDosingTime>
<ActTachoVoltage>0.000</ActTachoVoltage>
<SetTachoVoltage>24.000</SetTachoVoltage>
<ShotWeight>0.100</ShotWeight>
<ActExtruderCapacity>0.000</ActExtruderCapacity>
<SetExtruderCapacity>0.028</SetExtruderCapacity>
<ActExtruderSpeed>0.000</ActExtruderSpeed>
<SetExtruderSpeed>0.000</SetExtruderSpeed>
<ActWeightCapacity>0.000</ActWeightCapacity>
<Consumption>0.000</Consumption>
<MaxEventType>None</MaxEventType>
<Unit Index="0" Name="Unit1" Type="MCBalance">
<ActMotorSpeed>0.000</ActMotorSpeed>
<BatchCounter>0</BatchCounter>
<BatchWeight>0.000</BatchWeight>
<DosingMode>Volumetric</DosingMode>
<DosingTool>GLX</DosingTool>
<GrossWeight>0.000</GrossWeight>
<MaxEventType>None</MaxEventType>
<SetMotorSpeed>5.000</SetMotorSpeed>
<Component Index="0" Name="Component1" Type="AdditiveV">
<ActCapacity>0.000</ActCapacity>
<ActDosingPercentage>0.000</ActDosingPercentage>
<BandNumber>0</BandNumber>
<Consumption>0.000</Consumption>
<Material>glx-ng</Material>
<CorrectionFactor>1.000</CorrectionFactor>
<GranulateType>Normal</GranulateType>
<MeasurementTime>0.000</MeasurementTime>
<ActDosingWeight>0.000</ActDosingWeight>
<SetDosingWeight>0.000</SetDosingWeight>
<MaxEventType>None</MaxEventType>
<PumpType>None</PumpType>
<PumpSize>None</PumpSize>
<RegrindFillLevel>0.000</RegrindFillLevel>
<RegrindPercentage>0.000</RegrindPercentage>
<SetCapacity>0.000</SetCapacity>
<SetDosingPercentage>100.000</SetDosingPercentage>
<Tolerance>25.000</Tolerance>
<ValveType>None</ValveType>
<Unit Index="1" Name="Unit2" Type="MCBalance">
<ActMotorSpeed>0.000</ActMotorSpeed>
<BatchCounter>0</BatchCounter>
<BatchWeight>0.000</BatchWeight>
<DosingMode>Gravimetric</DosingMode>
<DosingTool>GLX</DosingTool>
<GrossWeight>0.000</GrossWeight>
<MaxEventType>None</MaxEventType>
<SetMotorSpeed>0.000</SetMotorSpeed>
<Component Index="0" Name="Component2" Type="AdditiveV">
<ActCapacity>0.000</ActCapacity>
<ActDosingPercentage>0.000</ActDosingPercentage>
<BandNumber>0</BandNumber>
<Consumption>0.000</Consumption>
<Material>glx-ng</Material>
<CorrectionFactor>1.000</CorrectionFactor>
<GranulateType>Normal</GranulateType>
<MeasurementTime>0.000</MeasurementTime>
<ActDosingWeight>0.000</ActDosingWeight>
<SetDosingWeight>0.000</SetDosingWeight>
<MaxEventType>None</MaxEventType>
<PumpType>None</PumpType>
<PumpSize>None</PumpSize>
<RegrindFillLevel>0.000</RegrindFillLevel>
<RegrindPercentage>0.000</RegrindPercentage>
<SetCapacity>0.000</SetCapacity>
<SetDosingPercentage>10.000</SetDosingPercentage>
<Tolerance>25.000</Tolerance>
<ValveType>None</ValveType>
public static class XmlSerializationHelper
public static T LoadFromXml<T>(this string xmlString, XmlSerializer serial = null)
serial = serial ?? new XmlSerializer(typeof(T));
using (var reader = new StringReader(xmlString))
return (T)serial.Deserialize(reader);
public static string GetXml<T>(this T obj, bool omitStandardNamespaces)
return obj.GetXml(null, omitStandardNamespaces);
public static string GetXml<T>(this T obj, XmlSerializer serializer = null, bool omitStandardNamespaces = false)
XmlSerializerNamespaces ns = null;
if (omitStandardNamespaces)
ns = new XmlSerializerNamespaces();
using (var textWriter = new StringWriter())
var settings = new XmlWriterSettings() { Indent = true };
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
(serializer ?? new XmlSerializer(obj.GetType())).Serialize(xmlWriter, obj, ns);
return textWriter.ToString();
public static class XmlAssert
public static void AreEqual(
var n1 = Normalize(expected);
var n2 = Normalize(actual);
var s1 = n1.ToString(SaveOptions.DisableFormatting);
var s2 = n1.ToString(SaveOptions.DisableFormatting);
private static XElement Normalize(XElement element)
.OrderBy(a => a.Name.ToString()),
.OrderBy(a => a.Name.ToString())
.Select(e => Normalize(e)));
.OrderBy(a => a.Name.ToString()));
return new XElement(element.Name, element.Attributes()
.OrderBy(a => a.Name.ToString()), element.Value);
public static class StringExtensions
public static int IndexOfFirstDifference(this string a, string b)
int max = Math.Min(a.Length, b.Length);
while (index < max && a[index] == b[index])
if (index >= a.Length || index >= b.Length)
public static void Main()
Console.WriteLine("Roslyn 2.0 Compiler; Environment version: " + Environment.Version);
Console.WriteLine("Uncaught exception: ");