使用Mongo驱动升级IBsonSerializer

本文关键字:IBsonSerializer Mongo 使用 | 更新日期: 2023-09-27 17:50:01

Mongo Drivers的旧实现导致了这样的代码:

public object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType)
{
    if (nominalType == typeof(T))
    {
        if (typeof(V) == typeof(string))
            return _deSerializeFunc(bsonReader.ReadString());
        else if (typeof(V) == typeof(int))
            return _deSerializeFunc(bsonReader.ReadInt32());
        else if (typeof(V) == typeof(double))
            return _deSerializeFunc(bsonReader.ReadDouble());
        else if (typeof(V) == typeof(decimal))
            return _deSerializeFunc((decimal)bsonReader.ReadDouble());
    }
    return null;
}

新的接口完全不同。如何开始用这个新接口实现前面的代码?

public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{

使用Mongo驱动升级IBsonSerializer

在。net驱动程序的2.0版本中,我们需要向序列化器传递更多信息。我们没有向方法中添加更多参数,而是将这些参数打包成两个新参数。context形参保存的值在整个序列化操作中应该是恒定的,而args形参保存的值在序列化复杂类型时在每个级别上都是变化的。

移植到新设计应该相对容易:

  1. reader参数现在处于上下文中。读者
  2. nomaltype参数现在在args中。NominalType
  3. actualType参数已经消失

关于actualType,现在每个序列化器都有责任确定实际类型(使用它想要的任何约定),并在实际类型与标称类型不同时查找并委托给实际序列化器。如果要序列化的类不是多态的,那么名义类型和实际类型总是相同的。