Compartir a través de


Configuración de serialización en Orleans

La configuración de la serialización en Orleans es una parte fundamental del diseño general del sistema. Aunque Orleans proporciona valores predeterminados razonables, puede configurar la serialización para que se adapte a las necesidades de las aplicaciones. Para enviar datos entre hosts, Orleans.Serialization admite la delegación en otros serializadores, como Newtonsoft.Json y System.Text.Json. Puede agregar compatibilidad con otros serializadores siguiendo el patrón establecido por esas implementaciones. Para el almacenamiento de granos, es preferible usar IGrainStorageSerializer para configurar un serializador personalizado.

Configuración de Orleans para usar Newtonsoft.Json

Para configurar Orleans para serializar determinados tipos mediante Newtonsoft.Json, primero debe hacer referencia al paquete NuGet Microsoft.Orleans.Serialization.NewtonsoftJson. A continuación, configure el serializador, especificando los tipos de los que será responsable. En el ejemplo siguiente, especificaremos que el serializador Newtonsoft.Json será responsable de todos los tipos del espacio de nombres Example.Namespace.

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

En el ejemplo anterior, la llamada a AddNewtonsoftJsonSerializer agrega compatibilidad para serializar y deserializar valores mediante Newtonsoft.Json.JsonSerializer. Se debe realizar una configuración similar en todos los clientes que necesiten controlar esos tipos.

En el caso de los tipos marcados con GenerateSerializerAttribute), Orleans preferirá el serializador generado antes que el serializador Newtonsoft.Json.

Configuración de Orleans para usar System.Text.Json

Como alternativa, para configurar Orleans para usar System.Text.Json para serializar los tipos, haga referencia al paquete NuGet Microsoft.Orleans.Serialization.SystemTextJson. A continuación, configure el serializador, especificando los tipos de los que será responsable. En el ejemplo siguiente, especificaremos que el serializador System.Text.Json será responsable de todos los tipos del espacio de nombres Example.Namespace.

Tenga en cuenta el ejemplo siguiente al interactuar con ISiloBuilder:

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

Proveedores de serializadores externos

Es importante asegurarse de que la configuración de la serialización sea idéntica en todos los clientes y silos. Si las configuraciones no son coherentes, pueden producirse errores de serialización.

Los proveedores de serialización que implementan IExternalSerializer se pueden especificar mediante la propiedad SerializationProviderOptions.SerializationProviders de ClientConfiguration y GlobalConfiguration en el 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, se pueden especificar en la configuración XML en la propiedad <SerializationProviders /> de <Messaging>:

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

En ambos casos, se pueden configurar varios proveedores. La colección está ordenada, lo que significa que, si se especifica un proveedor que puede serializar los tipos A y B antes de un proveedor que solo puede serializar el tipo B, no se usará el último proveedor.

Consulte también