Mongo DB - проблема со списком <string>, вложенная в словарь <строка, объект> - драйвер c # - PullRequest
1 голос
/ 06 июля 2011

При получении документа из MongoDB я получаю следующую ошибку:

"Невозможно определить фактический тип объекта для десериализации. NominalType - System.Object, а BsonType - Array."

Объект, который я сериализую, имеет свойство Dictionary<string, object>.Я могу поместить в словарь простую строку и вытащить ее без ошибки, но если есть List<string>, тогда я получаю ошибку десериализации.

Я использую официальный драйвер c # (v 1.1).Я могу просто запросить документ, используя оболочку Mongo, так что мне кажется, что проблема с 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);

1 Ответ

1 голос
/ 07 июля 2011

Я думаю, что следующий простой пример воспроизводит проблему.Используйте класс:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...