<PackageReference Include="Castle.Core" Version="5.1.1" />

XmlArraySerializer

using System; using System.Collections; namespace Castle.Components.DictionaryAdapter.Xml { public class XmlArraySerializer : XmlTypeSerializer { public static readonly XmlArraySerializer Instance = new XmlArraySerializer(); public override XmlTypeKind Kind => XmlTypeKind.Collection; public override bool CanGetStub => true; protected XmlArraySerializer() { } public override object GetStub(IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor) { return Array.CreateInstance(node.ClrType.GetElementType(), 0); } public override object GetValue(IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor) { ArrayList arrayList = new ArrayList(); Type elementType = node.ClrType.GetElementType(); XmlReferenceManager references = XmlAdapter.For(parent).References; accessor.GetCollectionAccessor(elementType).GetCollectionItems(node, parent, references, arrayList); return arrayList.ToArray(elementType); } public override void SetValue(IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor, object oldValue, ref object value) { Array array = (Array)value; Array array2 = null; Array array3 = (Array)oldValue; Type elementType = array.GetType().GetElementType(); IXmlCollectionAccessor collectionAccessor = accessor.GetCollectionAccessor(elementType); IXmlCursor xmlCursor = collectionAccessor.SelectCollectionItems(node, true); XmlTypeSerializer serializer = collectionAccessor.Serializer; XmlReferenceManager references = XmlAdapter.For(parent).References; for (int i = 0; i < array.Length; i++) { object itemSafe = GetItemSafe(array3, i); object value2 = array.GetValue(i); object newValue = value2; collectionAccessor.SetValue(xmlCursor, parent, references, xmlCursor.MoveNext(), itemSafe, ref newValue); if (array2 != null) array2.SetValue(newValue, i); else if (!object.Equals(newValue, value2)) { array2 = Array.CreateInstance(elementType, array.Length); Array.Copy(array, array2, i); array2.SetValue(newValue, i); } } xmlCursor.RemoveAllNext(); if (array2 != null) value = array2; } private static object GetItemSafe(Array array, int index) { if (array == null || index < 0 || index >= array.Length) return null; return array.GetValue(index); } } }