using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Xml.Linq; using System.Xml.Serialization; namespace ArchestrAServices.ASBContract; public static class SerializationExtensions { private static readonly Dictionary xmlSerializers = new Dictionary(); private static readonly object serializersLock = new object(); public static XmlSerializer GetTypeSerializer(Type objectType) { if (objectType == null) { return null; } XmlSerializer xmlSerializer; lock (serializersLock) { if (!xmlSerializers.ContainsKey(objectType)) { string defaultNamespace = "urn:invensys.schemas"; object[] customAttributes = objectType.GetCustomAttributes(inherit: true); if (customAttributes.Length != 0) { object[] array = customAttributes; for (int i = 0; i < array.Length; i++) { if (array[i] is XmlRootAttribute xmlRootAttribute) { defaultNamespace = xmlRootAttribute.Namespace; break; } } } xmlSerializer = new XmlSerializer(objectType, defaultNamespace); xmlSerializers.Add(objectType, xmlSerializer); } else { xmlSerializer = xmlSerializers[objectType]; } } return xmlSerializer; } public static string ToXml(this object value) { string text = string.Empty; if (value != null) { try { using TextWriter textWriter = new StringWriter(CultureInfo.CurrentCulture); lock (serializersLock) { XmlSerializer typeSerializer = GetTypeSerializer(value.GetType()); if (typeSerializer != null) { typeSerializer.Serialize(textWriter, value); text = textWriter.ToString(); } } } catch { } } if (Environment.Is64BitProcess) { using TextReader textReader = new StringReader(text); using IEnumerator enumerator = XDocument.Load(textReader).Elements().GetEnumerator(); if (enumerator.MoveNext()) { XElement current = enumerator.Current; XAttribute xAttribute = current.Attribute(XNamespace.Xmlns + "xsd"); XAttribute xAttribute2 = current.Attribute(XNamespace.Xmlns + "xsi"); if (xAttribute != null && xAttribute2 != null) { current.ReplaceAttributes(xAttribute2, xAttribute); } using TextWriter textWriter2 = new StringWriter(CultureInfo.CurrentCulture); current.Save(textWriter2); text = textWriter2.ToString(); } } return text; } }