home icon indicating copy to clipboard operation
home copied to clipboard

Collection Expression with single element breaks Serialize&Deserialize

Open Dummbledore opened this issue 1 year ago • 2 comments

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. grafik

Current workaround would be to not use collection expression for lists containing only a single element, although difficult in bigger projects. Hopefully this helps.

Dummbledore avatar Oct 22 '24 10:10 Dummbledore