2013-05-30 5 views
2

У меня есть несколько вопросов, которые тесно связаны, поэтому я группирую их по этому вопросу.Сериализация сложных объектов для mongoDB

Я пытаюсь создать постоянный db для моей объектной модели с использованием C# и драйверов и базы данных mongoDB. Я хочу иметь возможность хранить все мои объекты-пользователи - внутри этих пользователей должны быть сеансы («список» или подобная структура данных), и в каждом сеансе есть разные события и записи, которые они создали (также списки). Когда выполняется новый запрос, я сначала ищу пользователя по его идентификатору. Если он существует, я создаю объект сеанса. Добавьте этот объект сеанса в список сеансов пользователя, а затем выполните соответствующие обновления (добавление событий или записей в сеансы). (иначе я создаю нового пользователя - добавьте его в db, а затем выполните предыдущие шаги)

Моя проблема в том, что когда я делаю "collection.save(user)" или "find(user)" Я получаю ошибки - не может сериализовать абстрактный класс. Per the documentation Я мог бы использовать функцию «авто-картографирования», поэтому я думал, что это будет работать из коробки. Это было бы прекрасно. Я хотел бы, чтобы мой объект db отображался как только контейнер для моих пользовательских объектов, как в классе UsersDb.

Если нет - существуют ли соответствующие классы контейнеров «mongodb», я могу использовать (т. Е. Вместо «List<Session>» использовать ->BsonList<Session>)? Также как мне нужно создавать экземпляры контейнеров внутри моих классов? Если они генерируются сериализатором, я должен инициировать их в конструкторе? Кроме того, как я могу хранить произвольные «динамические» данные в моих классах (только некоторые регулярные JS)

Я создаю основную коллекцию, как это:

public class UsersDb 
{ 
    public UsersDb() 
    { 
     MongoServerSettings settings =new MongoServerSettings(); 
     settings.Server = new MongoServerAddress("localhost",27017); 
     MongoServer server = new MongoServer(settings); 
     MongoDatabase db = server.GetDatabase("defaultDb"); 
     Users = db.GetCollection<User>("Users"); 
     //Users.Drop(); 
    } 

    public MongoCollection<User> Users { get; set; }   
} 

Вот мой пользовательский класс: уже здесь у меня есть потому что конструктор должен иметь возможность создавать список сеансов, но что произойдет, если он был сериализован драйвером mongo?

public User() 
{ 
    SessionComparer uc = new SessionComparer(); 
    Sessions = new List<Session>();; 
} 

public ObjectId Id { get; set; } 
public string Udid { get; set; } 
public DateTime EnrollDate { get; set; } 
public string Email { get; set; } 
public string UserName { get; set; } 
public string Password { get; set; } 
public List<Session> Sessions { get; set; } 

Моей сессия класс

public class Session 
{ 
    public Session() 
    { 
     Events = new List<Event>(); 
     Records = new List<Record>(); 
    } 
    public string SessionId { get; set; } 
    public DateTime Time { get; set; } 
    public dynamic Parameters { get; set; } 
    public IList<Event> Events { get; set; } 
    public IList<Record> Records { get; set; } 
} 

Запись

public class Record 
{ 
    public Record() 
    { 
     RecordId = Guid.NewGuid().ToString(); 
     CreatedAt = DateTime.Now; 
    } 
    public string Name { get; set; } 
    public string RecordId { get; set; } 
    public DateTime CreatedAt { get; set; } 
    public DateTime Time { get; set; } 
    public dynamic Data { get; set; } 
} 

и событие

public class Record 
{ 
    public Record() 
    { 
     RecordId = Guid.NewGuid().ToString(); 
     CreatedAt = DateTime.Now; 
    } 
    public string Name { get; set; } 
    public string RecordId { get; set; } 
    public DateTime CreatedAt { get; set; } 
    public DateTime Time { get; set; } 
    public dynamic Data { get; set; } 
} 
+0

Какие классы здесь абстрактны? Не могли бы вы полностью разместить сообщение об исключении? –

+0

Вот сообщение, которое я получаю: {«Сообщение»: «Произошла ошибка.», «ExceptionMessage»: «Невозможно создать абстрактный класс.», «ExceptionType»: «System.MissingMethodException», «StackTrace»: в System.RuntimeTypeHandle.CreateInstance (RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean & canBeCached, RuntimeMethodHandleInternal & ctor, Boolean & bNeedSecurityCheck) \ r \ n –

ответ

0

Вы не можете де-сериализовать динамичным. Чтобы использовать реальные классы, вам нужно иметь что-то более строгое.

Возможно следующий обходной может быть использован для:

[BsonKNownTypes(typeof(Implementation1))] 
[BsonKNownTypes(typeof(Implementation2))] 
public class DynamicModelHere {} 
public class Implementation1 : DynamicModelHere { property, property, property } 
public class Implementation2 : DynamicModelHere { property, property, property } 
Смежные вопросы