From da8d12b9e4ced98b77efc4c7dc8cd943270e5093 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 27 May 2021 23:14:26 +0200 Subject: [PATCH] Fix Variables serialization for MongoDB provider --- ...lsa.Persistence.MongoDb.csproj.DotSettings | 2 + .../Serializers/VariablesSerializer.cs | 40 +++++++++++++++++++ .../Services/DatabaseRegister.cs | 17 ++++++-- 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj.DotSettings create mode 100644 src/persistence/Elsa.Persistence.MongoDb/Serializers/VariablesSerializer.cs diff --git a/src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj.DotSettings b/src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj.DotSettings new file mode 100644 index 000000000..17962b139 --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.MongoDb/Serializers/VariablesSerializer.cs b/src/persistence/Elsa.Persistence.MongoDb/Serializers/VariablesSerializer.cs new file mode 100644 index 000000000..51f290fe1 --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/Serializers/VariablesSerializer.cs @@ -0,0 +1,40 @@ +using System; +using Elsa.Models; +using MongoDB.Bson.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NodaTime; +using NodaTime.Serialization.JsonNet; + +namespace Elsa.Persistence.MongoDb.Serializers +{ + public class VariablesSerializer : IBsonSerializer + { + public static VariablesSerializer Instance { get; } = new(); + + private readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple, + TypeNameHandling = TypeNameHandling.Auto, + }.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); + + public Type ValueType => typeof(Variables); + + public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value) => Serialize(context, args, (Variables) value); + + public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Variables value) + { + var json = JsonConvert.SerializeObject(value, _serializerSettings); + context.Writer.WriteString(json); + } + + object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) => Deserialize(context, args); + + public Variables Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + var text = context.Reader.ReadString(); + return JsonConvert.DeserializeObject(text, _serializerSettings)!; + } + } +} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseRegister.cs b/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseRegister.cs index fe2a0ab1e..2e9d3a8e4 100644 --- a/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseRegister.cs +++ b/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseRegister.cs @@ -32,9 +32,19 @@ namespace Elsa.Persistence.MongoDb.Services cm.SetIsRootClass(true); cm.MapIdProperty(x => x.Id); }); - - BsonClassMap.RegisterClassMap(cm => cm.AutoMap()); - BsonClassMap.RegisterClassMap(cm => cm.AutoMap()); + + BsonClassMap.RegisterClassMap(cm => + { + cm.MapProperty(p => p.Variables).SetSerializer(VariablesSerializer.Instance); + cm.AutoMap(); + }); + + BsonClassMap.RegisterClassMap(cm => + { + cm.MapProperty(p => p.Variables).SetSerializer(VariablesSerializer.Instance); + cm.AutoMap(); + }); + BsonClassMap.RegisterClassMap(cm => cm.AutoMap()); BsonClassMap.RegisterClassMap(cm => cm.AutoMap()); } @@ -48,6 +58,7 @@ namespace Elsa.Persistence.MongoDb.Services private static void RegisterSerializers() { + BsonSerializer.RegisterSerializer(VariablesSerializer.Instance); BsonSerializer.RegisterSerializer(JObjectSerializer.Instance); BsonSerializer.RegisterSerializer(ObjectSerializer.Instance); BsonSerializer.RegisterSerializer(new InstantSerializer());