Orleans 中的序列化配置

Orleans 中的序列化配置是整个系统设计的关键部分。 虽然 Orleans 提供可推理的默认值,但你可以配置序列化以满足应用的需求。 对于在主机之间发送数据,Orleans.Serialization 支持委托给其他序列化程序,例如 Newtonsoft.JsonSystem.Text.Json。 可以遵循这些实现设置的模式来添加对其他序列化程序的支持。 对于粒度存储,最好使用 IGrainStorageSerializer 来配置自定义序列化程序。

将 Orleans 配置为使用 Newtonsoft.Json

若要配置 Orleans 以使用 Newtonsoft.Json 序列化某些类型,必须先引用 Microsoft.Orleans.Serialization.NewtonsoftJson NuGet 包。 然后,配置序列化程序,指定它将负责的类型。 在下面的示例中,我们将指定 Newtonsoft.Json 序列化程序将负责 Example.Namespace 命名空间中的所有类型。

siloBuilder.Services.AddSerializer(serializerBuilder =>
{
    serializerBuilder.AddNewtonsoftJsonSerializer(
        isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});

在前面的示例中,对 AddNewtonsoftJsonSerializer 的调用添加了对使用 Newtonsoft.Json.JsonSerializer 序列化和反序列化值的支持。 必须在需要处理这些类型的所有客户端上执行类似的配置。

对于使用 GenerateSerializerAttribute 标记的类型,Orleans 将首选生成的序列化程序而不是 Newtonsoft.Json 序列化程序。

将 Orleans 配置为使用 System.Text.Json

或者,若要配置 Orleans 以使用 System.Text.Json 序列化类型,请引用 Microsoft.Orleans.Serialization.SystemTextJson NuGet 包。 然后,配置序列化程序,指定它将负责的类型。 在下面的示例中,我们将指定 System.Text.Json 序列化程序将负责 Example.Namespace 命名空间中的所有类型。

ISiloBuilder 交互时,请考虑以下示例:

siloBuilder.Services.AddSerializer(serializerBuilder =>
{
    serializerBuilder.AddJsonSerializer(
        isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});

外部序列化程序提供程序

务必确保所有客户端和接收器上的序列化配置完全相同。 如果配置不一致,可能会发生序列化错误。

可以在代码中使用 ClientConfigurationGlobalConfigurationSerializationProviderOptions.SerializationProviders 属性来指定实现 IExternalSerializer 的序列化提供程序:

// Client configuration
var clientConfiguration = new ClientConfiguration();
clientConfiguration.SerializationProviders.Add(
    typeof(FantasticSerializer).GetTypeInfo());

// Global configuration
var globalConfiguration = new GlobalConfiguration();
globalConfiguration.SerializationProviders.Add(
    typeof(FantasticSerializer).GetTypeInfo());

或者,可以在 XML 配置中 <Messaging><SerializationProviders /> 属性下指定它们:

<Messaging>
    <SerializationProviders>
        <Provider type="GreatCompany.FantasticSerializer, GreatCompany.SerializerAssembly" />
    </SerializationProviders>
</Messaging>

在这两种情况下,都可以配置多个提供程序。 该集合是有序的,这意味着,如果在能够序列化类型 AB 的提供程序之后指定了只能序列化类型 B 的提供程序,则不会使用后一个提供程序。

另请参阅