Configuração de serialização no Orleans
A configuração da serialização no Orleans é uma parte crucial do design geral do sistema. Embora o Orleans forneça padrões razoáveis, você pode configurar a serialização para atender às necessidades de seus aplicativos. Para enviar dados entre hosts, Orleans.Serialization dá suporte à delegação a outros serializadores, como Newtonsoft.Json e System.Text.Json. Você pode adicionar suporte para outros serializadores seguindo o padrão definido por essas implementações. Para o armazenamento de granularidade, é melhor usar IGrainStorageSerializer para configurar um serializador personalizado.
Configurar Orleans para usar Newtonsoft.Json
Para configurar o Orleans a serializar determinados tipos usando Newtonsoft.Json
, primeiro você precisa referenciar o pacote NuGet Microsoft.OrleansOrleans.Serialization.NewtonsoftJson. Em seguida, configure o serializador, especificando os tipos pelos quais ele será responsável. No exemplo a seguir, especificaremos que o serializador Newtonsoft.Json
será responsável por todos os tipos no namespace Example.Namespace
.
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddNewtonsoftJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
No exemplo anterior, a chamada para AddNewtonsoftJsonSerializer adiciona suporte para serializar e desserializar valores usando Newtonsoft.Json.JsonSerializer
. Uma configuração semelhante deve ser executada em todos os clientes que precisam lidar com esses tipos.
Para tipos marcados com GenerateSerializerAttribute), Orleans preferirá o serializador gerado em vez do serializador Newtonsoft.Json
.
Configurar Orleans para usar System.Text.Json
Como alternativa, para configurar Orleans para usar System.Text.Json
para serializar seus tipos, você faz referência ao pacote NuGet Microsoft.Orleans.Serialization.SystemTextJson. Em seguida, configure o serializador, especificando os tipos pelos quais ele será responsável. No exemplo a seguir, especificaremos que o serializador System.Text.Json
será responsável por todos os tipos no namespace Example.Namespace
.
- Instale o pacote NuGet Microsoft.Orleans.Serialization.SystemTextJson.
- Configure o serializador usando o método AddJsonSerializer.
Considere o seguinte exemplo ao interagir com o ISiloBuilder:
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
Provedores de serializador externo
É importante garantir que a configuração de serialização seja idêntica em todos os clientes e silos. Se as configurações forem inconsistentes, erros de serialização poderão ocorrer.
Os provedores de serialização, que implementam IExternalSerializer
, podem ser especificados usando a propriedade SerializationProviderOptions.SerializationProviders de ClientConfiguration e GlobalConfiguration no código:
// Client configuration
var clientConfiguration = new ClientConfiguration();
clientConfiguration.SerializationProviders.Add(
typeof(FantasticSerializer).GetTypeInfo());
// Global configuration
var globalConfiguration = new GlobalConfiguration();
globalConfiguration.SerializationProviders.Add(
typeof(FantasticSerializer).GetTypeInfo());
Como alternativa, eles podem ser especificados na configuração XML usando a propriedade <SerializationProviders />
de <Messaging>
:
<Messaging>
<SerializationProviders>
<Provider type="GreatCompany.FantasticSerializer, GreatCompany.SerializerAssembly" />
</SerializationProviders>
</Messaging>
Em ambos os casos, vários provedores podem ser configurados. A coleção é ordenada, significando que, se um provedor que possa serializar os tipos A
e B
for especificado antes de um provedor que só pode serializar o tipo B
, o último provedor não será usado.