Partage via


Configuration de la sérialisation dans Orleans

La configuration de la sérialisation dans Orleans est une partie cruciale de la conception globale du système. Bien que Orleans fournisse des valeurs par défaut raisonnables, vous pouvez configurer la sérialisation en fonction des besoins de vos applications. Pour l’envoi de données entre les hôtes, Orleans.Serialization prend en charge la délégation à d’autres sérialiseurs, par exemple Newtonsoft.Json et System.Text.Json. Vous pouvez ajouter la prise en charge d’autres sérialiseurs en suivant le modèle défini par ces implémentations. Pour le stockage des grains, il est préférable d’utiliser IGrainStorageSerializer afin de configurer un sérialiseur personnalisé.

Configurer Orleans pour utiliser Newtonsoft.Json

Pour configurer Orleans afin de sérialiser certains types à l’aide de Newtonsoft.Json, vous devez d’abord référencer le package NuGet Microsoft.Orleans.Serialization.NewtonsoftJson. Configurez ensuite le sérialiseur en spécifiant les types dont il est responsable. Dans l’exemple suivant, nous allons spécifier que le sérialiseur Newtonsoft.Json est responsable de tous les types de l’espace de noms Example.Namespace.

siloBuilder.Services.AddSerializer(serializerBuilder =>
{
    serializerBuilder.AddNewtonsoftJsonSerializer(
        isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});

Dans l’exemple précédent, l’appel à AddNewtonsoftJsonSerializer ajoute la prise en charge de la sérialisation et de la désérialisation des valeurs à l’aide de Newtonsoft.Json.JsonSerializer. Une configuration similaire doit être effectuée sur tous les clients qui doivent gérer ces types.

Pour les types qui sont marqués avec GenerateSerializerAttribute, Orleans préfère le sérialiseur généré au sérialiseur Newtonsoft.Json.

Configurer Orleans pour utiliser System.Text.Json

Vous pouvez également configurer Orleans pour utiliser System.Text.Json afin de sérialiser vos types en référençant le package NuGet Microsoft.Orleans.Serialization.SystemTextJson. Configurez ensuite le sérialiseur en spécifiant les types dont il est responsable. Dans l’exemple suivant, nous allons spécifier que le sérialiseur System.Text.Json est responsable de tous les types de l’espace de noms Example.Namespace.

Prenons l’exemple suivant au moment de l’interaction avec ISiloBuilder :

siloBuilder.Services.AddSerializer(serializerBuilder =>
{
    serializerBuilder.AddJsonSerializer(
        isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});

Fournisseurs de sérialiseurs externes

Il est important de s’assurer que la configuration de la sérialisation est identique sur tous les clients et silos. Si les configurations ne sont pas cohérentes, des erreurs de sérialisation peuvent se produire.

Les fournisseurs de sérialisation qui implémentent IExternalSerializer peuvent être spécifiés à l’aide de la propriété SerializationProviderOptions.SerializationProviders de ClientConfiguration et GlobalConfiguration dans le code :

// Client configuration
var clientConfiguration = new ClientConfiguration();
clientConfiguration.SerializationProviders.Add(
    typeof(FantasticSerializer).GetTypeInfo());

// Global configuration
var globalConfiguration = new GlobalConfiguration();
globalConfiguration.SerializationProviders.Add(
    typeof(FantasticSerializer).GetTypeInfo());

Ils peuvent également être spécifiés dans la configuration XML sous la propriété <SerializationProviders /> de <Messaging> :

<Messaging>
    <SerializationProviders>
        <Provider type="GreatCompany.FantasticSerializer, GreatCompany.SerializerAssembly" />
    </SerializationProviders>
</Messaging>

Dans les deux cas, plusieurs fournisseurs peuvent être configurés. La collection est ordonnée, ce qui signifie que si un fournisseur qui peut sérialiser les types A et B est spécifié avant un fournisseur qui peut sérialiser uniquement le type B, alors ce dernier fournisseur ne sera pas utilisé.

Voir aussi