gpt4 book ai didi

c# - Orleans 7.0 序列化程序无法与源自 Nuget 包的 POCO 一起使用

转载 作者:行者123 更新时间:2023-12-03 07:58:13 37 4
gpt4 key购买 nike

我有一个 Orleans 7.0 项目,但我在使用新的默认序列化器时遇到了问题。

Orleans 3.6.5 中的旧序列化程序运行良好,它可以序列化几个内部 Nuget 包中的所有模型和 Dtos。

现在在 Orleans 7.0 中,该项目无法识别 Nuget 包中的模型,并且我收到此错误:

Orleans.Serialization.CodecNotFoundException: Could not find a copier for type InternalProject.Model.
   at Orleans.Serialization.Serializers.CodecProvider.ThrowCopierNotFound(Type type) in /_/src/Orleans.Serialization/Serializers/CodecProvider.cs:line 666
   at Orleans.Serialization.Serializers.CodecProvider.GetDeepCopier[T]() in /_/src/Orleans.Serialization/Serializers/CodecProvider.cs:line 300
   at Orleans.Serialization.ServiceCollectionExtensions.CopierHolder`1.get_Value() in /_/src/Orleans.Serialization/Hosting/ServiceCollectionExtensions.cs:line 203
   at Orleans.Serialization.GeneratedCodeHelpers.OrleansGeneratedCodeHelper.GetService[TService](Object caller, ICodecProvider codecProvider) in /_/src/Orleans.Serialization/GeneratedCodeHelpers/OrleansGeneratedCodeHelper.cs:lin
e 75
   at OrleansCodeGen.InternalProject.Model.Copier_SpecificModel..ctor(ICodecProvider codecProvider) in C:\Projects\InternalProject.Model\Orleans.CodeGenerator\Orleans.CodeGenerator.Orle
ansSerializationSourceGenerator\InternalProject.Model.orleans.g.cs:line 20736
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
   at System.Reflection.ConstructorInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)
   at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance[T](IServiceProvider provider)
   at Orleans.Serialization.GeneratedCodeHelpers.OrleansGeneratedCodeHelper.GetService[TService](Object caller, ICodecProvider codecProvider) in /_/src/Orleans.Serialization/GeneratedCodeHelpers/OrleansGeneratedCodeHelper.cs:lin
e 72

现在有趣的部分是:当我在主项目中复制粘贴完全相同的类时,我不再收到此错误,并且该类序列化得很好。

我尝试在主项目中直接引用Nuget项目(ProjectReference),结果是一样的。

我只在两种情况下消除错误:

  1. 当我将 Json Serializer 与 IgnoreCycles 一起使用时(这在我的场景中是不可取的,并不能消除根本问题)
siloBuilder.Services.AddSerializer(sb =>
{
sb.AddJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Nuget.Namespace"),
new JsonSerializerOptions()
{
ReferenceHandler = ReferenceHandler.IgnoreCycles
}
);
});
  • 当我直接在主项目中添加类时。错误中的示例类:
  • [GenerateSerializer]
    public sealed class Class1: Class1Base
    {
    public Class1()
    {

    }

    public Class1(IRequest request, bool boolean, InternalClass internalClass)
    : base(request, boolean)
    {
    InternalClass = internalClass;
    }

    [Id(0)]
    public InternalClass InternalClass{ get; set; }

    }

    [GenerateSerializer]
    public class Class1Base
    {
    public Class1Base()
    {

    }
    public Class1Base(IRequest request, bool boolean)
    {
    Request = request;
    Boolean= boolean;
    }

    [Id(0)]
    public IRequest Request { get; set; }
    [Id(1)]
    public bool Boolean{ get; set; }
    }

    最佳答案

    奥尔良序列化器具有很多性能和灵活性优势,但正如您所发现的,它在使用第三方类型方面具有非常硬的优势。您有几个选择,但都不是很好

    1. 继续使用第 3 方类型并为要序列化的每种类型定义代理和编解码器。这可能是一项非常繁重的工作,而且可能不是最好的主意。 See this document for how to do that ,但请注意,如果您不小心错过了图中的某个类型,它会在运行时崩溃,因此请确保您的测试良好。

    2. 使用不同的序列化器。 Orleans 附带了基于 Json 的序列化器,更容易使用。它们可能不如 Orleans Serializer 快,但运行起来要简单得多。这是最简单的选择,而且几乎没有什么缺点。 See this article on how to do that

    3. 从 DTO 中删除第 3 方类型。在此选项中,您可以更改grain合约,以便仅使用第一方类型(您自己定义的类型)在grains之间发送消息。这不太方便,并且消除了奥尔良对象透明度的一些魔力,但消除了问题。这是我在我的案例中选择的选项,因为我认为它可以使我的模型更清晰。

    我还怀疑,通过大量的努力,可以编写一个源生成器,它可以自动遍历grain调用中使用的对象图,并自动生成第三方类型的编解码器和代理,以完全消除这个问题。但我觉得没有必要。

    关于c# - Orleans 7.0 序列化程序无法与源自 Nuget 包的 POCO 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75397083/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com