public override object Deserialize(XMLReader input) { var backingArr = new List <object>(); int depth = input.Depth; input.GoToNextTag(); XMLTypeHandler handler = XMLHelpers.GetDerivedTypeHandlerFromXMLTag(input, out string tag) ?? _elementTypeHandler; while (input.Depth >= depth && !input.Finished) { object newObj = tag.Contains("/") ? null : handler.Deserialize(input); backingArr.Add(newObj); input.GoToNextTag(); handler = XMLHelpers.GetDerivedTypeHandlerFromXMLTag(input, out tag) ?? _elementTypeHandler; } Type listGenericType = XMLHelpers.ListType.MakeGenericType(_elementType); var list = (IList)Activator.CreateInstance(listGenericType, backingArr.Count); for (var i = 0; i < backingArr.Count; i++) { list.Add(backingArr[i]); } return(list); }
public void DeserializeKeyValue(XMLReader input, out object key, out object value) { key = _keyDefault; value = _valueDefault; int depth = input.Depth; input.GoToNextTag(); while (input.Depth >= depth && !input.Finished) { XMLTypeHandler handler = XMLHelpers.GetDerivedTypeHandlerFromXMLTag(input, out string currentTag); switch (currentTag) { case "Key": if (handler == null) { handler = _keyHandler.Value.TypeHandler; } key = handler.Deserialize(input); break; case "Value": if (handler == null) { handler = _valueHandler.Value.TypeHandler; } value = handler.Deserialize(input); break; default: Engine.Log.Warning($"Unknown deserialization tag in KVP - {currentTag}.", MessageSource.XML); return; } input.GoToNextTag(); } }