2015-05-19 29 views
2

老實施蒙戈驅動因素之一是導致了這種代碼:升級IBsonSerializer與蒙戈司機2

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

您可能想看看我的開源[PubComp.NoSql.MongoDbDriver](https://www.nuget.org/packages/PubComp.NoSql.MongoDbDriver/),它將這樣的問題抽象化。由於IQueryable()(預計在v2.1),FileSets和Indexes驅動程序目前缺乏支持,它仍然在使用MongoDB C#Driver v2.0的傳統API。 –

回答

2

在2.0版本的.NET驅動程序中,我們需要將更多信息傳遞給序列化程序。我們將參數打包成兩個新參數,而不是向方法中添加更多參數。 context參數保存對整個序列化操作應該保持不變的值,args參數保存在序列化複雜類型時在每個級別更改的值。

它應該是比較容易地移植到新的設計:

  1. 讀者參數現在是context.Reader現在
  2. 的nominalType參數是args.NominalType
  3. 的actualType參數有消失

關於actualType,現在每個序列化程序都有責任確定實際的類型(使用它想要的任何規則)並查找並在實際類型與名義類型不同時委託給實際串行器。如果你正在序列化的類不是多態的,那麼名義類型和實際類型總是相同的。