home
home copied to clipboard
Collection Expression with single element breaks Serialize&Deserialize
Hello, i stumbled onto this bug. If a project contains any Collection Expression with a single element, it will break Serialize&Deserialize. Example:
using System.Xml;
using ExtendedXmlSerializer;
using ExtendedXmlSerializer.Configuration;
IExtendedXmlSerializer serializer = new ConfigurationContainer().Create();
try
{
string contents = serializer.Serialize(new XmlWriterSettings {Indent = true}, new Class1());
}
catch (Exception e)
{
Console.WriteLine(e);
}
return;
internal class Class1
{
public int Test {get; set;}
}
internal class Class2
{
public IReadOnlyList<int> List1 { get; set; } = []; //this works
public IReadOnlyList<int> List2 { get; set; } = [1]; //this breaks Serialize&Deserialize
public IReadOnlyList<int> List3 { get; set; } = [1,2]; //this works
public IReadOnlyList<int> List4 { get; set; } = new List<int>(){1}; //this works (workaround)
}
Full stack trace i got:
Sprache.ParseException: Parsing failure: unexpected '<'; expected letter (Line 1, Column 1); recently consumed:
at Sprache.ParserExtensions.Parse[T](Parser`1 parser, String input)
at ExtendedXmlSerializer.ContentModel.Reflection.TypeNameFormatter.Format(TypeInfo type)
at ExtendedXmlSerializer.ContentModel.Reflection.TypeNameFormatter.Get(TypeInfo parameter)
at ExtendedXmlSerializer.Core.Sources.LinkedDecoratedSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.Core.Sources.DecoratedSource`2.Get(TParameter parameter)
at System.Linq.Lookup`2.Create(IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparer)
at ExtendedXmlSerializer.ContentModel.Reflection.AssemblyTypePartitions.Format(IGrouping`2 grouping)
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector)
at ExtendedXmlSerializer.ContentModel.Reflection.AssemblyTypePartitions.Create(Assembly parameter)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at ExtendedXmlSerializer.Core.Sources.CacheBase`2.Get(TKey key)
at ExtendedXmlSerializer.ContentModel.Reflection.AssemblyTypePartitions.Get(TypePartition parameter)
at ExtendedXmlSerializer.Core.Sources.FirstAssignedSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.ContentModel.Reflection.PartitionedTypeCandidates.Create(IIdentity parameter)
at ExtendedXmlSerializer.Core.Sources.StructureCacheBase`2.CreateStructure(TKey parameter)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetValueLocked(TKey key, CreateValueCallback createValueCallback)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetValue(TKey key, CreateValueCallback createValueCallback)
at ExtendedXmlSerializer.Core.Sources.StructureCacheBase`2.Get(TKey key)
at ExtendedXmlSerializer.ContentModel.Reflection.TypeCandidates.Get(IIdentity parameter)
at ExtendedXmlSerializer.ContentModel.Reflection.Types.Create(IIdentity parameter)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at ExtendedXmlSerializer.Core.Sources.CacheBase`2.Get(TKey key)
at ExtendedXmlSerializer.ContentModel.Members.MemberSerializers.IsMember(IMember profile)
at ExtendedXmlSerializer.ContentModel.Members.MemberSerializers.Content(IMember profile, IMemberAccess access)
at ExtendedXmlSerializer.ContentModel.Members.MemberSerializers.Get(IMember parameter)
at System.Linq.Enumerable.SelectArrayIterator`2.Fill(ReadOnlySpan`1 source, Span`1 destination, Func`2 func)
at System.Linq.Enumerable.SelectArrayIterator`2.ToArray()
at ExtendedXmlSerializer.ContentModel.Members.MemberSerializations.Create(TypeInfo parameter)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at ExtendedXmlSerializer.Core.Sources.CacheBase`2.Get(TKey key)
at ExtendedXmlSerializer.ContentModel.Members.InstanceMemberSerialization..ctor(TypeInfo type, IMemberSerializations serializations)
at ExtendedXmlSerializer.ContentModel.Members.InstanceMemberSerializations.Get(TypeInfo parameter)
at ExtendedXmlSerializer.ContentModel.Members.MemberedContents.Get(TypeInfo parameter)
at ExtendedXmlSerializer.Core.Sources.ConditionalSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.Core.Sources.ConditionalSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.Core.Sources.ConditionalSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.Core.Sources.ConditionalSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.Core.Sources.ConditionalSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.Core.Sources.ConditionalSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.Core.Sources.ConditionalSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.Core.Sources.ConditionalSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.Core.Sources.ConditionalSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.ContentModel.Content.Recursion.Get(TypeInfo parameter)
at ExtendedXmlSerializer.Core.Sources.DecoratedSource`2.Get(TParameter parameter)
at ExtendedXmlSerializer.ExtensionModel.Types.NullableStructureAwareExtension.NullableStructureAwareContents.Get(TypeInfo parameter)
at ExtendedXmlSerializer.ExtensionModel.Xml.CustomSerializationExtension.Contents.Get(TypeInfo parameter)
at ExtendedXmlSerializer.Core.Sources.Cache`2.Create(TKey parameter)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at ExtendedXmlSerializer.Core.Sources.CacheBase`2.Get(TKey key)
at ExtendedXmlSerializer.ExtensionModel.References.DeferredContents.Get(TypeInfo parameter)
at ExtendedXmlSerializer.ContentModel.Content.Serializers.Get(TypeInfo parameter)
at ExtendedXmlSerializer.ExtensionModel.References.ReferenceAwareSerializers.Get(TypeInfo parameter)
at ExtendedXmlSerializer.ContentModel.Content.DynamicAwareSerializers.Get(TypeInfo parameter)
at ExtendedXmlSerializer.Core.Sources.Cache`2.Create(TKey parameter)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at ExtendedXmlSerializer.Core.Sources.CacheBase`2.Get(TKey key)
at ExtendedXmlSerializer.ExtensionMethodsForCoreSources.Get[T](IParameterizedSource`2 this, Type parameter)
at ExtendedXmlSerializer.ExtensionModel.Xml.Write.Execute(Writing parameter)
at ExtendedXmlSerializer.ExtensionModel.Xml.Serializer.Serialize(XmlWriter writer, Object instance)
at ExtendedXmlSerializer.ExtensionModel.Xml.ExtendedXmlSerializer.Serialize(XmlWriter writer, Object instance)
at ExtendedXmlSerializer.ExtensionModel.Xml.InstanceFormatter.Get(Object parameter)
at ExtendedXmlSerializer.ExtensionMethodsForSerialization.Serialize(IExtendedXmlSerializer this, IXmlWriterFactory factory, Func`1 stream, Object instance)
at ExtendedXmlSerializer.ExtensionMethodsForSerialization.Serialize(IExtendedXmlSerializer this, XmlWriterSettings settings, Object instance)
at Program.<Main>$(String[] args) in C:\***\ExtendedXmlSerializerBugExample\ExtendedXmlSerializerBugExample\Program.cs:line 10
It looks like there is a problem with the type name "<>z__ReadOnlySingleElementList`1" generated from the collection expression.
Current workaround would be to not use collection expression for lists containing only a single element, although difficult in bigger projects. Hopefully this helps.