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
.
- Installez le package NuGet Microsoft.Orleans.Serialization.SystemTextJson.
- Configurez le sérialiseur à l’aide de la méthode AddJsonSerializer.
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é.