diff --git a/src/Cuemon.Xml/Extensions/Serialization/Converters/XmlConverterDecoratorExtensions.cs b/src/Cuemon.Xml/Extensions/Serialization/Converters/XmlConverterDecoratorExtensions.cs index 3eedc3c6..f1fd4f50 100644 --- a/src/Cuemon.Xml/Extensions/Serialization/Converters/XmlConverterDecoratorExtensions.cs +++ b/src/Cuemon.Xml/Extensions/Serialization/Converters/XmlConverterDecoratorExtensions.cs @@ -112,7 +112,7 @@ public static IDecorator> AddEnumerableConverter(this IDecor { if (isDictionaryLike) { - w.WriteStartElement(q.LocalName); + w.WriteStartElement(q.Prefix, q.LocalName, q.Namespace); foreach (var element in o) { var elementType = element.GetType(); @@ -125,31 +125,38 @@ public static IDecorator> AddEnumerableConverter(this IDecor var keyName = Decorator.Enclose(keyValue.ToString()).SanitizeXmlElementName(); if (Decorator.Enclose(valuePropertyType).IsComplex()) { - Decorator.Enclose(w).WriteObject(valueValue, valuePropertyType, opts => opts.Settings.RootName = new XmlQualifiedEntity(keyName)); + Decorator.Enclose(w).WriteObject(valueValue, valuePropertyType, opts => opts.Settings.RootName = new XmlQualifiedEntity(keyName, q.Namespace)); } else { - w.WriteElementString(keyName, Convert.ToString(valueValue, CultureInfo.InvariantCulture)); + w.WriteStartElement(keyName, q.Namespace); + w.WriteValue(valueValue); + w.WriteEndElement(); } } w.WriteEndElement(); } else { + var isDocumentRoot = w.WriteState == WriteState.Start; + if (isDocumentRoot) { w.WriteStartElement(q.Prefix, q.LocalName, q.Namespace); } + var qe = new XmlQualifiedEntity(q.Prefix, q.LocalName, q.Namespace); foreach (var item in o) { if (item == null) { continue; } var itemType = item.GetType(); if (Decorator.Enclose(itemType).IsComplex()) { - var localName = q.LocalName; - Decorator.Enclose(w).WriteObject(item, itemType, opts => opts.Settings.RootName = new XmlQualifiedEntity(localName)); + Decorator.Enclose(w).WriteObject(item, itemType, opts => opts.Settings.RootName = qe); } else { - w.WriteElementString(q.LocalName, Convert.ToString(item, CultureInfo.InvariantCulture)); + w.WriteStartElement(q.Prefix, q.LocalName, q.Namespace); + w.WriteValue(item); + w.WriteEndElement(); } } + if (isDocumentRoot) { w.WriteEndElement(); } } } else diff --git a/src/Cuemon.Xml/Serialization/Formatters/XmlFormatterOptions.cs b/src/Cuemon.Xml/Serialization/Formatters/XmlFormatterOptions.cs index 0c53ec69..7ea3beb1 100644 --- a/src/Cuemon.Xml/Serialization/Formatters/XmlFormatterOptions.cs +++ b/src/Cuemon.Xml/Serialization/Formatters/XmlFormatterOptions.cs @@ -129,9 +129,14 @@ internal XmlSerializerOptions RefreshWithConverterDependencies() _refreshed = true; if (Settings.FlattenCollectionItems) { - var existing = Decorator.Enclose(Settings.Converters).FirstOrDefaultWriterConverter(typeof(IEnumerable)); - if (existing != null) { Settings.Converters.Remove(existing); } - Decorator.Enclose(Settings.Converters).AddEnumerableConverter(flattenItems: true); + var converters = Decorator.Enclose(Settings.Converters); + while (true) + { + var existing = converters.FirstOrDefaultWriterConverter(typeof(IEnumerable)); + if (existing == null) { break; } + Settings.Converters.Remove(existing); + } + converters.AddEnumerableConverter(flattenItems: true); } Decorator.Enclose(Settings.Converters) .AddExceptionConverter(SensitivityDetails.HasFlag(FaultSensitivityDetails.StackTrace), SensitivityDetails.HasFlag(FaultSensitivityDetails.Data))