Compartilhar via


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.

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.

Confira também