提示
建议使用 JSON 持久格式来将数据存储在新项目的数据库中。 您还应该强烈考虑将 useProperties 设置为 true 以将键值限制为字符串。
Quartz.Serialization.Json 为使用 Json.NET 处理实际序列化过程的作业存储提供 JSON 序列化支持。
安装
您需要将 NuGet 包引用添加到使用 Quartz 的项目中。
Install-Package Quartz.Serialization.Json
配置
经典的基于属性的配置
var properties = new NameValueCollection{["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",// "json" is alias for "Quartz.Simpl.JsonObjectSerializer, Quartz.Serialization.Json"["quartz.serializer.type"] = "json"};ISchedulerFactory schedulerFactory = new StdSchedulerFactory(properties);
使用调度程序构建器进行配置
var config = SchedulerBuilder.Create();config.UsePersistentStore(store =>{// it's generally recommended to stick with// string property keys and values when serializingstore.UseProperties = true;store.UseGenericDatabase(dbProvider, db =>db.ConnectionString = "my connection string");store.UseJsonSerializer();});ISchedulerFactory schedulerFactory = config.Build();
从二进制序列化迁移
现在有官方的迁移解决方案,因为每个设置都可能存在怪癖,但有一个适合您的方法。
- 配置自定义序列化器,如下面的
MigratorSerializer可以读取二进制序列化格式并写入 JSON 格式 - 要么让系统在运行时逐渐迁移,要么创建一个程序,将所有相关的序列化资产加载并写回数据库
示例混合串行器
public class MigratorSerializer : IObjectSerializer{private BinaryObjectSerializer binarySerializer;private JsonObjectSerializer jsonSerializer;public MigratorSerializer(){this.binarySerializer = new BinaryObjectSerializer();// you might need custom configuration, see sections about customizing// in documentationthis.jsonSerializer = new JsonObjectSerializer();}public T DeSerialize<T>(byte[] data) where T : class{try{// Attempt to deserialize data as JSONvar result = this.jsonSerializer.DeSerialize<T>(data);return result;}catch (JsonReaderException){// Presumably, the data was not JSON, we instead use the binary serializerreturn this.binarySerializer.DeSerialize<T>(data);}}public void Initialize(){this.binarySerializer.Initialize();this.jsonSerializer.Initialize();}public byte[] Serialize<T>(T obj) where T : class{return this.jsonSerializer.Serialize<T>(obj);}}
自定义 JSON.NET
如果需要自定义 JSON.NET 设置,则需要继承自定义实现并覆盖 CreateSerializerSettings。
class CustomJsonSerializer : JsonObjectSerializer{protected override JsonSerializerSettings CreateSerializerSettings(){var settings = base.CreateSerializerSettings();settings.Converters.Add(new MyCustomConverter());return settings;}}
然后配置它使用
store.UseSerializer<CustomJsonSerializer>();// or"quartz.serializer.type" = "MyProject.CustomJsonSerializer, MyProject"
自定义日历序列化
如果您实现了自定义日历,则需要为其实现 ICalendarSerializer。 有一个方便的基类 CalendarSerializer,您可以使用它来获得强类型体验。
自定义日历和序列化程序
[Serializable]class CustomCalendar : BaseCalendar{public CustomCalendar(){}// binary serialization supportprotected CustomCalendar(SerializationInfo info, StreamingContext context) : base(info, context){SomeCustomProperty = info?.GetBoolean("SomeCustomProperty") ?? true;}public bool SomeCustomProperty { get; set; } = true;// binary serialization supportpublic override void GetObjectData(SerializationInfo info, StreamingContext context){base.GetObjectData(info, context);info?.AddValue("SomeCustomProperty", SomeCustomProperty);}}// JSON serialization supportclass CustomCalendarSerializer : CalendarSerializer<CustomCalendar>{protected override CustomCalendar Create(JObject source){return new CustomCalendar();}protected override void SerializeFields(JsonWriter writer, CustomCalendar calendar){writer.WritePropertyName("SomeCustomProperty");writer.WriteValue(calendar.SomeCustomProperty);}protected override void DeserializeFields(CustomCalendar calendar, JObject source){calendar.SomeCustomProperty = source["SomeCustomProperty"]!.Value<bool>();}}
配置自定义日历序列化程序
var config = SchedulerBuilder.Create();config.UsePersistentStore(store =>{store.UseJsonSerializer(json =>{json.AddCalendarSerializer<CustomCalendar>(new CustomCalendarSerializer());});});// or just globally which is what above code callsJsonObjectSerializer.AddCalendarSerializer<CustomCalendar>(new CustomCalendarSerializer());
