From 6440caa7d49d29a284098ec63a56e59a6f48e5c9 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Fri, 21 May 2021 10:50:23 +0100 Subject: [PATCH] Improve anonymous serialization exception --- .../Resolvers/DynamicObjectResolver.cs | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/Elasticsearch.Net/Utf8Json/Resolvers/DynamicObjectResolver.cs b/src/Elasticsearch.Net/Utf8Json/Resolvers/DynamicObjectResolver.cs index 6be0ba4eb2c..e6d098e7d8f 100644 --- a/src/Elasticsearch.Net/Utf8Json/Resolvers/DynamicObjectResolver.cs +++ b/src/Elasticsearch.Net/Utf8Json/Resolvers/DynamicObjectResolver.cs @@ -31,6 +31,8 @@ using System.Linq; using System.Reflection; using System.Reflection.Emit; +using System.Runtime.Serialization; +using System.Text; using System.Text.RegularExpressions; using System.Threading; using Elasticsearch.Net.Utf8Json.Formatters; @@ -1318,7 +1320,34 @@ public DynamicMethodAnonymousFormatter(byte[][] stringByteKeysField, object[] se public void Serialize(ref JsonWriter writer, T value, IJsonFormatterResolver formatterResolver) { if (_serialize == null) throw new InvalidOperationException(GetType().Name + " does not support Serialize."); - _serialize(_stringByteKeysField, _serializeCustomFormatters, ref writer, value, formatterResolver); + + try + { + _serialize(_stringByteKeysField, _serializeCustomFormatters, ref writer, value, formatterResolver); + } + catch (Exception e) + { + var type = value.GetType(); + var properties = type.GetProperties(); + + var message = $"Failed to serialize anonymous type: {type}."; + + if (properties.Any()) + { + var sb = new StringBuilder() + .AppendLine(message).AppendLine("The type defines the following properties:"); + + foreach (var property in properties) + sb.AppendLine($"'{property.Name}' of type {property.PropertyType}"); + + message = sb.ToString().TrimEnd(Environment.NewLine.ToCharArray()); + } + + throw new AnonymousTypeSerializationException(message, e) + { + AnonymousType = type + }; + } } public T Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver) @@ -1327,4 +1356,15 @@ public T Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterReso return _deserialize(_deserializeCustomFormatters, ref reader, formatterResolver); } } + + public class AnonymousTypeSerializationException : SerializationException + { + public AnonymousTypeSerializationException() { } + + public AnonymousTypeSerializationException(string message) : base(message) { } + + public AnonymousTypeSerializationException(string message, Exception innerException) : base(message, innerException) { } + + public Type AnonymousType { get; set; } + } }