从MongoDB检索文档时出现以下错误:
“无法确定实际的类型 反序列化的对象。 NominalType是 System.Object和BsonType是Array。“
我正在序列化的对象具有Dictionary<string, object>
属性。我可以在字典中放一个简单的字符串并将其拉出而不会出现错误,但是如果有List<string>
则会出现反序列化错误。
我正在使用官方的c#驱动程序(v 1.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);
答案 0 :(得分:1)
我认为以下简单示例再现了该问题。使用类:
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票: