diff --git a/src/persistence/Elsa.Persistence.MongoDb/Serializers/TypeSerializer.cs b/src/persistence/Elsa.Persistence.MongoDb/Serializers/TypeSerializer.cs new file mode 100644 index 000000000..964d0c0e0 --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/Serializers/TypeSerializer.cs @@ -0,0 +1,28 @@ +using System; +using Elsa.Models; +using MongoDB.Bson.Serialization; +using Rebus.Extensions; + +namespace Elsa.Persistence.MongoDb.Serializers +{ + public class TypeSerializer : IBsonSerializer + { + public static TypeSerializer Instance { get; } = new(); + public Type ValueType => typeof(Variables); + public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value) => Serialize(context, args, (Type) value); + + public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Type value) + { + var typeName = value.GetSimpleAssemblyQualifiedName(); + context.Writer.WriteString(typeName); + } + + object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) => Deserialize(context, args); + + public Type Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + var typeName = context.Reader.ReadString(); + return typeName is not null and not "" ? Type.GetType(typeName)! : default!; + } + } +} \ 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 2abe65882..7958daa3f 100644 --- a/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseRegister.cs +++ b/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseRegister.cs @@ -63,6 +63,7 @@ namespace Elsa.Persistence.MongoDb.Services BsonSerializer.RegisterSerializer(VariablesSerializer.Instance); BsonSerializer.RegisterSerializer(JObjectSerializer.Instance); BsonSerializer.RegisterSerializer(ObjectSerializer.Instance); + BsonSerializer.RegisterSerializer(TypeSerializer.Instance); BsonSerializer.RegisterSerializer(new InstantSerializer()); } }