Orleans 中的序列化配置
Orleans 中的序列化配置是整个系统设计的关键部分。 虽然 Orleans 提供可推理的默认值,但你可以配置序列化以满足应用的需求。 对于在主机之间发送数据,Orleans.Serialization 支持委托给其他序列化程序,例如 Newtonsoft.Json 和 System.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
命名空间中的所有类型。
- 安装 Microsoft.Orleans.Serialization.SystemTextJson NuGet 包。
- 使用 AddJsonSerializer 方法配置序列化程序。
与 ISiloBuilder 交互时,请考虑以下示例:
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
外部序列化程序提供程序
务必确保所有客户端和接收器上的序列化配置完全相同。 如果配置不一致,可能会发生序列化错误。
可以在代码中使用 ClientConfiguration 和 GlobalConfiguration 的 SerializationProviderOptions.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>
在这两种情况下,都可以配置多个提供程序。 该集合是有序的,这意味着,如果在能够序列化类型 A
和 B
的提供程序之后指定了只能序列化类型 B
的提供程序,则不会使用后一个提供程序。