在 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"));
});

外部序列化程序提供程序

确保所有客户端和孤岛上的序列化配置相同。 不一致的配置可能会导致序列化错误。

指定使用ClientConfigurationSerializationProviderOptions.SerializationProviders属性和GlobalConfiguration在代码中实现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类型的提供程序之前指定,那么后一个提供程序将不会用于类型B

另请参阅