Configurazione della serializzazione in Orleans
La configurazione della serializzazione in Orleans è una parte fondamentale della progettazione complessiva del sistema. Sebbene Orleans fornisca impostazioni predefinite ragionevoli, è possibile configurare la serializzazione in base alle esigenze delle app. Per l'invio di dati tra host, Orleans.Serialization supporta la delega ad altri serializzatori, ad esempio Newtonsoft.Json e System.Text.Json. È possibile aggiungere il supporto per altri serializzatori seguendo il modello impostato da tali implementazioni. Per l'archiviazione granulare è consigliabile usare IGrainStorageSerializer per configurare un serializzatore personalizzato.
Configurare Orleans usando Newtonsoft.Json
Per configurare Orleans la serializzazione di determinati tipi tramite Newtonsoft.Json
, è prima necessario fare riferimento al pacchetto NuGet Microsoft.OrleansSerialization.NewtonsoftJson. Configurare quindi il serializzatore, specificando i tipi per cui sarà responsabile. Nell'esempio seguente si specifica che il serializzatore Newtonsoft.Json
sarà responsabile di tutti i tipi nello spazio dei nomi Example.Namespace
.
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddNewtonsoftJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
Nell'esempio precedente la chiamata a AddNewtonsoftJsonSerializer aggiunge il supporto per la serializzazione e la deserializzazione dei valori usando Newtonsoft.Json.JsonSerializer
. È necessario eseguire una configurazione simile in tutti i client che devono gestire tali tipi.
Per i tipi contrassegnati con GenerateSerializerAttribute), Orleans preferisce il serializzatore generato rispetto al serializzatore Newtonsoft.Json
.
Configurare Orleans per usare System.Text.Json
In alternativa, per configurare Orleans per usare System.Text.Json
per serializzare i tipi, fare riferimento al pacchetto NuGet Microsoft.Orleans. Serialization.SystemTextJson. Configurare quindi il serializzatore, specificando i tipi per cui sarà responsabile. Nell'esempio seguente si specifica che il serializzatore System.Text.Json
sarà responsabile di tutti i tipi nello spazio dei nomi Example.Namespace
.
- Installare il pacchetto NuGet Microsoft.OrleansSerialization.SystemTextJson.
- Configurare il serializzatore usando il metodo AddJsonSerializer.
Si consideri l'esempio seguente quando si interagisce con l’oggetto ISiloBuilder:
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
Provider di serializzatori esterni
È importante assicurarsi che la configurazione della serializzazione sia identica in tutti i client e i silo. Se le configurazioni non sono coerenti, possono verificarsi degli errori di serializzazione.
I provider di serializzazione che implementano IExternalSerializer
possono essere specificati usando la proprietà SerializationProviderOptions.SerializationProviders di ClientConfiguration e GlobalConfiguration nel codice:
// Client configuration
var clientConfiguration = new ClientConfiguration();
clientConfiguration.SerializationProviders.Add(
typeof(FantasticSerializer).GetTypeInfo());
// Global configuration
var globalConfiguration = new GlobalConfiguration();
globalConfiguration.SerializationProviders.Add(
typeof(FantasticSerializer).GetTypeInfo());
In alternativa, è possibile specificare nella configurazione XML nella proprietà <SerializationProviders />
di <Messaging>
:
<Messaging>
<SerializationProviders>
<Provider type="GreatCompany.FantasticSerializer, GreatCompany.SerializerAssembly" />
</SerializationProviders>
</Messaging>
In entrambi i casi, è possibile configurare più provider. La raccolta viene ordinata, ovvero se un provider che può serializzare i tipi A
e B
viene specificato prima di un provider che può serializzare solo il tipo B
, quest'ultimo provider non verrà utilizzato.