是否已从MongoDB的最新C#驱动程序中删除IBsonSerializationOptions

本文关键字:驱动程序 删除 IBsonSerializationOptions 最新 MongoDB 是否 | 更新日期: 2023-09-27 18:00:51

我的C#项目中有以下源代码,它可以用mongocsharpdriver 1.8.3版本成功构建。但是在我将MongoDB C#驱动程序升级到2.0.1之后,编译失败,错误表明找不到IBsonSerializationOptionsDateTimeSerializationOptions类(接口(,并且我还检查了程序集中的所有命名空间,这些类型似乎是从最新版本的MongoDB C#驱动程序中删除的。

public void Apply(BsonMemberMap memberMap)
{
    IBsonSerializationOptions options = null;
    switch (memberMap.MemberInfo.MemberType)
    {
       case MemberTypes.Property:
           PropertyInfo propertyInfo = (PropertyInfo)memberMap.MemberInfo;
           if (propertyInfo.PropertyType == typeof(DateTime) ||
               propertyInfo.PropertyType == typeof(DateTime?))
               options = new DateTimeSerializationOptions(DateTimeKind.Local);
           break;
       case MemberTypes.Field:
           FieldInfo fieldInfo = (FieldInfo)memberMap.MemberInfo;
           if (fieldInfo.FieldType == typeof(DateTime) ||
               fieldInfo.FieldType == typeof(DateTime?))
               options = new DateTimeSerializationOptions(DateTimeKind.Local);
           break;
       default:
           break;
   }
   memberMap.SetSerializationOptions(options);
}

我的问题是,在最新版本的MongoDB C#驱动程序中,这些类型的等价物是什么?

是否已从MongoDB的最新C#驱动程序中删除IBsonSerializationOptions

在C#驱动程序2.0中,您需要实现IBsonSerializer

public class LocalTimeSerializer : IBsonSerializer
{
    public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        return context.Reader.ReadDateTime();
    }
    public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
    {
        context.Writer.WriteDateTime(((DateTime)value).ToLocalTime().Ticks);
    }
    public Type ValueType { get { return typeof(DateTime); } }
}

并且您应该注册序列化程序

BsonSerializer.RegisterSerializer(typeof(DateTime), new LocalTimeSerializer());

在C#驱动程序的2.0版本中,序列化选项已被删除,并成为序列化程序本身的属性。您不需要设置序列化选项,而是配置一个适当配置的序列化程序并使用它

2.0版本驱动程序的约定实现如下所示:

public class LocalDateTimeConvention : IMemberMapConvention
{
    public string Name
    {
        get { return "LocalDateTime"; }
    }
    public void Apply(BsonMemberMap memberMap)
    {
        if (memberMap.MemberType == typeof(DateTime))
        {
            var dateTimeSerializer = new DateTimeSerializer(DateTimeKind.Local);
            memberMap.SetSerializer(dateTimeSerializer);
        }
        else if (memberMap.MemberType == typeof(DateTime?))
        {
            var dateTimeSerializer = new DateTimeSerializer(DateTimeKind.Local);
            var nullableDateTimeSerializer = new NullableSerializer<DateTime>(dateTimeSerializer);
            memberMap.SetSerializer(nullableDateTimeSerializer);
        }
    }
}