orleans icon indicating copy to clipboard operation
orleans copied to clipboard

Serialization related exception for type configured to use Json serialization

Open gschuager opened this issue 1 year ago • 2 comments

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)

gschuager avatar Jan 14 '24 21:01 gschuager

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?

ReubenBond avatar Jan 15 '24 00:01 ReubenBond

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

gschuager avatar Jan 15 '24 01:01 gschuager