Condividi tramite


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.

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.

Vedi anche