Open zpxp opened 1 year ago
Both the GameCardModel
and GamePlayerModel
are poco classes decorated with [GenerateSerializer(GenerateFieldIds = GenerateFieldIds.PublicProperties)]
Update: If i change the converter and surrogates to use generics it now works
namespace Grains.Surrogates;
[GenerateSerializer]
public struct OneOfSurrogate<T0,T1>
{
[Id(0)] public T0? V0;
[Id(1)] public T1? V1;
}
// Implement the IConverter and IPopulator interfaces on the converter.
[RegisterConverter]
public sealed class OneOfSurrogateConverter<T0,T1> : IConverter<OneOf<T0,T1>, OneOfSurrogate<T0,T1>>
{
public OneOf<T0, T1> ConvertFromSurrogate(in OneOfSurrogate<T0, T1> surrogate)
=> surrogate.V0 != null
? OneOf<T0, T1>.FromT0(surrogate.V0)
: OneOf<T0, T1>.FromT1(surrogate.V1!);
public OneOfSurrogate<T0, T1> ConvertToSurrogate(in OneOf<T0, T1> value)
=> new()
{
V0 = value.IsT0 ? value.AsT0 : default,
V1 = value.IsT1 ? value.AsT1 : default,
};
}
This is a bug, we should support this and you're not the first to hit it. The generic approach which you ended up with is indeed a better approach. Also, we should consider creating an OrleansContrib repo to host serializers for various packages, such as this one.
Im getting a
CodecNotFoundException
when trying to serialize a generic struct type from an external lib,OneOf<GameCardModel, GamePlayerModel>
https://www.nuget.org/packages/OneOfHere is my
IConverter
And here is the generated orleans code where the error originates
The
IConverter
is in the same assembly as the grains and the sdk is installedI have another surrogate in the code base which works fine for a non generic struct type so im not sure what the issue is here.