mongodb - List嵌套在Dictionary- c#驱动程序

本文关键字:string object 驱动程序 嵌套 List mongodb Dictionary | 更新日期: 2023-09-27 18:01:30

当从MongoDB检索文档时,我得到以下错误:

"无法确定的实际类型。对象来反序列化。NominalType是系统。对象,BsonType为Array。"

我序列化的对象有一个Dictionary<string, object>属性。我可以在Dictionary中放入一个简单的字符串并将其拉出而不会出现错误,但如果存在List<string>,则会得到反序列化错误。

我正在使用官方的c#驱动程序(v1.1)。我可以使用Mongo shell查询文档,所以我很高兴这是MongoDB.Bson的问题。

什么建议/解决方法吗?

代码示例:

保存到MongoDB的示例对象:

public class WebUser
{
  public int _id;
  private DateTime startTime;
  private DateTime stopTime;
  private string browser;
  private string sessionID;
  private string ip;
  public List<PageView> PageViews;
  public Dictionary<string, Object> Session;
  public Save(){/*Data access code here*/}
  public static Single(int id){/*Data access code here*/}
}

数据访问码:

public T Single<T>(int id) where T : class, new()
{
  var server = MongoServer.Create(ConnectionString);
  var db = server.GetDatabase(DBName);
  var collection = db.GetCollection<T>(typeof(T).Name);   
  var value = collection.FindOneById(id);
  server.Disconnect();
  return value;
 }

这个可以正常工作:

var wu = WebUser.single(1);
wu.Session.Add("string key", "value");
wu.Session.Add("int key", 1);
wu.Save();
wu = WebUser.single(1);

这就是我得到错误的地方:

var wu = WebUser.single(1);
wu.Session.Add("list of values", new List<string>() { "yada", "yada 2", "yada 3" });
wu.Save();
//deserialize error on the retrieve below
wu = WebUser.single(1);

mongodb - List<string>嵌套在Dictionary<string中,object>- c#驱动程序

我认为下面这个简单的例子再现了这个问题。使用类:

public class C {
    public ObjectId Id;
    public object Obj;
}

和以下测试代码:

collection.RemoveAll();
var c = new C { Obj = new int[] { 1, 2, 3 } };
collection.Insert(c);
var r = collection.FindOneAs<C>(); // fails

问题是文档被序列化为:

> db.test.find()
{ "_id" : ObjectId("4e15b931e447ad6a54eb0114"), "Obj" : [ 1, 2, 3 ] }
>

和"Obj"的值没有类型信息,因此反序列化器不知道为"Obj"实例化什么类。

我已经为此创建了一个JIRA票据:

https://jira.mongodb.org/browse/csharp - 263