dotnet / dotnet/orleans

Orleans Serializer Throws when using a record type as a type argument in a ImmutableSortedDictionary<,>

Open
#8,302 5 comments 0 reactions 1 assignee Claimed by @ReubenBond View on GitHub
Needs: triage :mag:
Dominant language
C#
Stars
10.9k
Forks
2.1k
Avg merge
14h 42m
Merged PRs (30d)
354

Description

Hello, and thank you for all the amazing work on Orleans.

I have noticed that if you specify a record type as a type argument in a ImmutableSortedDictionary<,>, you get an exception.

```
Orleans.Serialization.CodecNotFoundException: Could not find a codec for type System.Collections.Generic.GenericEqualityComparer`1[TestRecord]
```

## Stacktrace

```
Unhandled exception. Orleans.Serialization.CodecNotFoundException: Could not find a codec for type System.Collections.Generic.GenericEqualityComparer`1[TestRecord].
at Orleans.Serialization.Serializers.CodecProvider.ThrowCodecNotFound(Type fieldType) in /_/src/Orleans.Serialization/Serializers/CodecProvider.cs:line 655
at Orleans.Serialization.Serializers.CodecProvider.GetCodec(Type fieldType) in /_/src/Orleans.Serialization/Serializers/CodecProvider.cs:line 161
at Orleans.Serialization.Serializers.AbstractTypeSerializer.WriteField[TBufferWriter](Writer`1& writer, UInt32 fieldIdDelta, Type expectedType, Object value) in /_/src/Orleans.Serialization/Serializers/AbstractTypeSerializer.cs:line 52
at Orleans.Serialization.Serializers.AbstractTypeSerializerWrapper`1.WriteField[TBufferWriter](Writer`1& writer, UInt32 fieldIdDelta, Type expectedType, TField value) in /_/src/Orleans.Serialization/Serializers/AbstractTypeSerializer.cs:line 33
at Orleans.Serialization.ServiceCollectionExtensions.ValueSerializerHolder`1.Serialize[TBufferWriter](Writer`1& writer, TField& value) in /_/src/Orleans.Serialization/Hosting/ServiceCollectionExtensions.cs:line 180
at Orleans.Serialization.Codecs.GeneralizedReferenceTypeSurrogateCodec`2.WriteField[TBufferWriter](Writer`1& writer, UInt32 fieldIdDelta, Type expectedType, TField value) in /_/src/Orleans.Serialization/Codecs/GeneralizedReferenceTypeSurrogateCodec.cs:line 57
at Orleans.Serialization.Serializer.SerializeToArray[T](T value) in /_/src/Orleans.Serialization/Serializer.cs:line 56
at Program.$(String[] args) in D:\junk\orleans-immutablesorteddictionary-bug\Program.cs:line 22
```

## Repro

```csharp
// See https://aka.ms/new-console-template for more information
using System.Collections.Immutable;
using Orleans.Serialization.Codecs;
using Orleans.Serialization;
using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();
services.AddSerializer();
var provider = services.BuildServiceProvider();

var serializer = provider.GetRequiredService();

serializer.SerializeToArray(ImmutableDictionary.Empty);//does not throw
serializer.SerializeToArray(ImmutableSortedDictionary.Empty);//throws 💥

[GenerateSerializer]
public record TestRecord;
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.