diff --git a/src/Hydrogen/Serialization/Builder/CompositeSerializer.cs b/src/Hydrogen/Serialization/Builder/CompositeSerializer.cs index d6c0b42c..bd1f6ce9 100644 --- a/src/Hydrogen/Serialization/Builder/CompositeSerializer.cs +++ b/src/Hydrogen/Serialization/Builder/CompositeSerializer.cs @@ -94,7 +94,6 @@ public override TItem Deserialize(EndianBinaryReader reader, SerializationContex } - public static class CompositeSerializer { public static CompositeSerializer Create(Func activator, MemberSerializationBinding[] memberBindings) => new CompositeSerializer(activator, memberBindings); @@ -111,11 +110,14 @@ public static IItemSerializer Create(Type itemType) .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null) .Invoke(null); - public static void Configure(IItemSerializer serializer, Type itemType, IEnumerable memberBindings) - => Configure(serializer, Tools.Lambda.CastFunc( () => itemType.ActivateWithCompatibleArgs(), itemType), memberBindings); + public static void Configure(IItemSerializer serializer, Type itemType, IEnumerable memberBindings) { + var constructor = itemType.FindCompatibleConstructor(Array.Empty()); + Guard.Ensure(constructor is not null, $"Unable to compose a serializer for type '{itemType.ToStringCS()}' as it did not have a public parameterless constructor"); + Configure(serializer, Tools.Lambda.CastFunc(() => constructor.Invoke(null), itemType), memberBindings); + } public static void Configure(IItemSerializer serializer, Delegate activator, IEnumerable memberBindings) { - Guard.Ensure(serializer.GetType().IsConstructedGenericTypeOf(typeof(CompositeSerializer<>)), "Serializer must be a CompositeSerializer"); + Guard.Ensure(serializer.GetType().IsConstructedGenericTypeOf(typeof(CompositeSerializer<>)), $"Serializer must be a {typeof(CompositeSerializer<>).ToStringCS()}"); serializer .GetType() .GetMethod(nameof(CompositeSerializer.Configure), BindingFlags.Instance | BindingFlags.NonPublic) diff --git a/tests/Hydrogen.Tests/Serialization/SerializerBuilderTests.cs b/tests/Hydrogen.Tests/Serialization/SerializerBuilderTests.cs index 0712a394..44b51c42 100644 --- a/tests/Hydrogen.Tests/Serialization/SerializerBuilderTests.cs +++ b/tests/Hydrogen.Tests/Serialization/SerializerBuilderTests.cs @@ -72,6 +72,17 @@ public class GenericType { public T2 Prop2 { get; set; } } + public class NoConstructorClass { + private NoConstructorClass() { + } + + public NoConstructorClass(string prop1) { + Prop1 = prop1; + } + public string Prop1 { get; set; } + + } + [Test] public void TestObject_1() { // test object @@ -636,4 +647,8 @@ public void SerializableMembersInBaseFirstOrder() { Assert.That(members[3].Name, Is.EqualTo("Prop4")); } + [Test] + public void NoSerializerForUnconstructableClass() { + Assert.That (() => ItemSerializer.Default, Throws.InvalidOperationException); + } }