Orleans 中的序列化設定
Orleans 中的序列化設定是整體系統設計的重要部分。 雖然 Orleans 提供合理的預設值,但您可以設定序列化以符合應用程式的需求。 若要在主機之間傳送資料,Orleans.Serialization 支援委派給其他序列化程式,例如 Newtonsoft.Json 和 System.Text.Json。 您可以遵循這些實作所設定的模式,以新增對其他序列化程式的支援。 針對粒紋儲存體,最好使用 IGrainStorageSerializer 來設定自訂序列化程式。
將 Orleans 設定為使用 Newtonsoft.Json
若要設定 Orleans 以使用 Newtonsoft.Json
序列化特定類型,您必須先參考 Microsoft.Orleans.Serialization.NewtonsoftJson NuGet 套件。 然後,設定序列化程式,並指定要負責的類型。 在下列範例中,我們將指定 Newtonsoft.Json
序列化程式將負責 Example.Namespace
命名空間中的所有類型。
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddNewtonsoftJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
在上述範例中,對 AddNewtonsoftJsonSerializer 的呼叫會使用 Newtonsoft.Json.JsonSerializer
新增序列化和還原序列化值的支援。 必須在需要處理這些類型的所有用戶端上執行類似的設定。
對於標示為 GenerateSerializerAttribute) 的類型,Orleans 會偏好產生的序列化程式而非 Newtonsoft.Json
序列化程式。
將 Orleans 設定為使用 System.Text.Json
或者,若要將 Orleans 設定為使用 System.Text.Json
來序列化您的類型,您可以參考 Microsoft.Orleans.Serialization.SystemTextJson NuGet 套件。 然後,設定序列化程式,並指定要負責的類型。 在下列範例中,我們將指定 System.Text.Json
序列化程式將負責 Example.Namespace
命名空間中的所有類型。
- 安裝 Microsoft.Orleans.Serialization.SystemTextJson NuGet 套件。
- 使用 AddJsonSerializer 方法設定序列化程式。
與 ISiloBuilder 互動時,請考慮下列範例:
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
外部序列化程式提供者
請務必確保所有用戶端和定址接收器上的序列化設定都相同。 如果設定不一致,可能會發生序列化錯誤。
您可以在程式碼中使用 ClientConfiguration 和 GlobalConfiguration 的 SerializationProviderOptions.SerializationProviders 屬性來指定實作 IExternalSerializer
的序列化提供者:
// Client configuration
var clientConfiguration = new ClientConfiguration();
clientConfiguration.SerializationProviders.Add(
typeof(FantasticSerializer).GetTypeInfo());
// Global configuration
var globalConfiguration = new GlobalConfiguration();
globalConfiguration.SerializationProviders.Add(
typeof(FantasticSerializer).GetTypeInfo());
或者,您可以在 <Messaging>
的 <SerializationProviders />
屬性下 ,在 XML 設定中予以指定:
<Messaging>
<SerializationProviders>
<Provider type="GreatCompany.FantasticSerializer, GreatCompany.SerializerAssembly" />
</SerializationProviders>
</Messaging>
在這兩種情況下,都可以設定多個提供者。 集合已排序,這表示如果提供者可以序列化類型 A
,而且 B
是在只能序列化類型 B
的提供者之前指定,則系統不會使用後者的提供者。