使用Mongo驱动程序2升级IBsonSerializer

时间:2015-05-19 14:30:17

标签: c# mongodb mongodb-csharp-2.0

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)
{

1 个答案:

答案 0 :(得分:2)

在2.0版本的.NET驱动程序中,我们需要将更多信息传递给序列化程序。我们不是在方法中添加更多参数,而是将参数打包成两个新参数。 context参数保存对于整个序列化操作应该是常量的值,并且args参数保存在序列化复杂类型时在每个级别更改的值。

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

  1. reader参数现在位于context.Reader
  2. nominalType参数现在位于args.NominalType
  3. actualType参数已消失
  4. 关于actualType,现在每个序列化程序负责确定实际类型(使用它想要的任何约定),并在实际类型不同于标称类型时查找和委托给实际的序列化程序。如果您要序列化的类不是多态的,那么名义类型和实际类型总是相同的。