ExtendedXmlSerializer / home

A configurable and eXtensible Xml serializer for .NET.

Home Page:https://extendedxmlserializer.github.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

NullReferenceException when deserializing a simple XML document

0xced opened this issue · comments

I'm trying to deserialize a very simple XML document with ExtendedXmlSerializer but I'm getting a NullReferenceException.

Here's what I'm doing.

Issue580.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="ExtendedXmlSerializer" Version="3.7.6" />
  </ItemGroup>

</Project>

Program.cs

using System;
using System.IO;
using System.Text;
using System.Xml.Serialization;
using ExtendedXmlSerializer;
using ExtendedXmlSerializer.Configuration;

const string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Customers>
  <Customer>
    <Name>Name1</Name>
  </Customer>
  <Customer>
    <Name>Name2</Name>
  </Customer>
</Customers>";
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml));

var xmlSerializer = new XmlSerializer(typeof(Subject));
var extendedXmlSerializer = new ConfigurationContainer().EnableImplicitTypingFromNamespacePublic<Subject>().Create();

var subject = (Subject)xmlSerializer.Deserialize(stream)!;
Console.WriteLine(subject.Customers[1].Name);

stream.Position = 0;

subject = extendedXmlSerializer.Deserialize<Subject>(stream);
Console.WriteLine(subject.Customers[1].Name);

[XmlRoot("Customers")]
public class Subject
{
    [XmlElement("Customer")]
    public Customer[] Customers { get; init; } = Array.Empty<Customer>();
}

public class Customer
{
    [XmlElement("Name")]
    public string Name { get; init; } = "";
}

I'd expect the ExtendedXmlSerializer to deserialize the document but instead I'm getting this exception:

Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at ExtendedXmlSerializer.ReflectionModel.TypeCoercer.Get(TypeInfo parameter)
   at System.Linq.Enumerable.SelectArrayIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable`1 items)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[TSource](IEnumerable`1 items)
   at ExtendedXmlSerializer.ReflectionModel.SelectCoercer`2.Get(ImmutableArray`1 parameter)
   at ExtendedXmlSerializer.Core.Sources.CoercedResult`3.Get(TParameter parameter)
   at ExtendedXmlSerializer.Core.Sources.CoercedResult`3.Get(TParameter parameter)
   at ExtendedXmlSerializer.Core.Sources.CoercedResult`3.Get(TParameter parameter)
   at ExtendedXmlSerializer.Core.Sources.DecoratedSource`2.Get(TParameter parameter)
   at ExtendedXmlSerializer.ReflectionModel.Extensions.Get[T](IParameterizedSource`2 this, TypeInfo[] parameters)
   at ExtendedXmlSerializer.ContentModel.Collections.Lists.CreateAdapter(Object parameter)
   at ExtendedXmlSerializer.ContentModel.Collections.Lists.Create(Object 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.ReferenceCacheBase`2.Get(TKey key)
   at ExtendedXmlSerializer.ExtensionModel.Xml.XmlListContentsActivator.Create(IFormatReader reader, Object instance, XmlContent content)
   at ExtendedXmlSerializer.ExtensionModel.Xml.XmlInnerContentActivator.Get(IFormatReader parameter)
   at ExtendedXmlSerializer.ContentModel.Content.InnerContentReader.Get(IFormatReader parameter)
   at ExtendedXmlSerializer.ContentModel.ReaderAdapter`1.Get(IFormatReader parameter)
   at ExtendedXmlSerializer.ContentModel.Collections.ArrayReader.Get(IFormatReader parameter)
   at ExtendedXmlSerializer.ContentModel.Members.Extensions.GetIfAssigned[T](IReader`1 this, IFormatReader reader)
   at ExtendedXmlSerializer.ContentModel.Serializer`1.Get(IFormatReader parameter)
   at ExtendedXmlSerializer.ContentModel.Members.MemberSerializer.Get(IFormatReader parameter)
   at ExtendedXmlSerializer.ContentModel.Members.MemberHandler.Handle(IInnerContent contents, IMemberSerializer member)
   at ExtendedXmlSerializer.ContentModel.Content.InnerContentServices.Handle(IInnerContent contents, IMemberSerializer member)
   at ExtendedXmlSerializer.ContentModel.Members.MemberInnerContentHandler.IsSatisfiedBy(IInnerContent parameter)
   at ExtendedXmlSerializer.ContentModel.Content.InnerContentReader.Get(IFormatReader parameter)
   at ExtendedXmlSerializer.ContentModel.Members.Extensions.GetIfAssigned[T](IReader`1 this, IFormatReader reader)
   at ExtendedXmlSerializer.ContentModel.Serializer`1.Get(IFormatReader parameter)
   at ExtendedXmlSerializer.ContentModel.SerializerAdapter`1.Get(IFormatReader parameter)
   at ExtendedXmlSerializer.ExtensionModel.Xml.Read.Get(XmlReader parameter)
   at ExtendedXmlSerializer.ExtensionModel.Xml.Serializer.Deserialize(XmlReader reader)
   at ExtendedXmlSerializer.ExtensionModel.Xml.ExtendedXmlSerializer.Deserialize(XmlReader reader)
   at ExtendedXmlSerializer.ExtensionMethodsForSerialization.Deserialize[T](IExtendedXmlSerializer this, XmlReaderSettings settings, Stream stream)
   at ExtendedXmlSerializer.ExtensionMethodsForSerialization.Deserialize[T](IExtendedXmlSerializer this, Stream stream)
   at Program.<Main>$(String[] args) in Program.cs:line 27

Note that deserializing with XmlSerializer works fine and prints Name2 as expected.

Am I misconfiguring the ExtendedXmlSerializer or am I not declaring my classes with the proper attributes? Or did I just uncovered a bug?

Hi @0xced thank you for writing in. Unfortunately, there are some incompatibilities with the traditional serializer and ExtendedXmlSerializer, and I believe this is captured in #461.

This is also listed in our known issues in our ReadMe:
https://github.com/ExtendedXmlSerializer/home#known-issues

However, if you feel this is a different issue from what is identified/listed above I can take a further look into this for you. 👍

GitHub
A configurable and eXtensible Xml serializer for .NET. - GitHub - ExtendedXmlSerializer/home: A configurable and eXtensible Xml serializer for .NET.

This appears to have been answered. Unfortunately, no further major work can be done on this project and it is essentially in maintenance mode. I am more than open to exploring pull requests if you (or anyone reading this) so wish to do so. If you have any further questions/comments, please reply, and we'll take it from there. Closing this for now.