orleans
orleans copied to clipboard
Serialization related exception for type configured to use Json serialization
I am trying to use the following type in a property of an object used as argument in a grain method: https://github.com/NetTopologySuite/NetTopologySuite.Features/blob/develop/src/NetTopologySuite.Features/FeatureCollection.cs
I configured Orleans serialization to use System.Text.Json for that particular type and assumed that Orleans would just ignore that type, but I am getting the following exception on startup:
Unhandled exception. System.ArgumentException: The number of generic arguments provided doesn't equal the arity of the generic type definition. (Parameter 'instantiation')
at System.RuntimeType.MakeGenericType(Type[] instantiation)
at Orleans.Serialization.Serializers.CodecProvider.CreateCodecInstance(Type fieldType, Type searchType) in /_/src/Orleans.Serialization/Serializers/CodecProvider.cs:line 505
at Orleans.Serialization.Serializers.CodecProvider.CreateCodecInstance(Type fieldType, Type searchType) in /_/src/Orleans.Serialization/Serializers/CodecProvider.cs:line 551
at Orleans.Serialization.Serializers.CodecProvider.TryCreateCodec(Type fieldType) in /_/src/Orleans.Serialization/Serializers/CodecProvider.cs:line 181
at Orleans.Serialization.Serializers.CodecProvider.TryGetCodec(Type fieldType) in /_/src/Orleans.Serialization/Serializers/CodecProvider.cs:line 170
at Orleans.Serialization.SerializerConfigurationAnalyzer.<AnalyzeSerializerAvailability>g__VisitType|0_0(Type type, MethodInfo methodInfo, <>c__DisplayClass0_0&) in /_/src/Orleans.Serialization/Hosting/SerializerConfigurationAnalyzer.cs:line 63
at Orleans.Serialization.SerializerConfigurationAnalyzer.AnalyzeSerializerAvailability(ICodecProvider codecProvider, TypeManifestOptions options) in /_/src/Orleans.Serialization/Hosting/SerializerConfigurationAnalyzer.cs:line 38
at Orleans.SerializerConfigurationValidator.Orleans.IConfigurationValidator.ValidateConfiguration() in /_/src/Orleans.Core/Configuration/Validators/SerializerConfigurationValidator.cs:line 60
at Orleans.Hosting.SiloHostedService.ValidateSystemConfiguration(IEnumerable`1 configurationValidators) in /_/src/Orleans.Runtime/Hosting/SiloHostedService.cs:line 41
at Orleans.Hosting.SiloHostedService..ctor(Silo silo, IEnumerable`1 configurationValidators, ILogger`1 logger) in /_/src/Orleans.Runtime/Hosting/SiloHostedService.cs:line 20
at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr)
at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitIEnumerable(IEnumerableCallSite enumerableCallSite, RuntimeResolverContext context)
...
Is this expected to work without errors?
(I tested this with v8)
Are you able to share details about the object being serialized? Do the types have Alias attributes? How are you configuring JSON serialization to serialize this type?
The object is something like this:
public record Job
{
public FeatureCollection? Map { get; init; }
}
there aren't any Alias attributes.
And the serialization configuration is as follows:
services.AddSerializer(serializerBuilder =>
{
var serializerOptions = new JsonSerializerOptions();
serializerOptions.Converters.Add(new GeoJsonConverterFactory());
var namespaces = new[] { "NetTopologySuite" };
serializerBuilder.AddJsonSerializer(
t =>
{
return namespaces.Any(x => t.Namespace!.StartsWith(x));
},
serializerOptions
);
});
it is using a GeoJSON converter from https://github.com/NetTopologySuite/NetTopologySuite.IO.GeoJSON, but I understand that it throws way before having to touch the converter at all