序列化配置 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的SerializationProviderOptions.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>
在这两种情况下,都可以配置多个提供程序。 集合是有序的。 这意味着,如果一个提供程序能够序列化A
和B
类型,并且在一个只能序列化B
类型的提供程序之前指定,那么后一个提供程序将不会用于类型B
。