2013-05-30 70 views
2

我有几个密切相关的问题,所以我将它们归入这个问题。将复杂对象序列化为mongoDB

我想创建一个持久数据库为我的对象模型使用c#和mongoDB驱动程序和数据库。我希望能够存储我的所有用户对象 - 在这些用户中应该是会话(“列表”或类似的数据结构),并且在每个会话中都是他们创建的不同事件和记录(也列出)。当发出新的请求时 - 最初我通过其标识符查找用户。如果存在,我创建一个会话对象。将该会话对象添加到用户的会话列表中,然后进行适当更新(向会话添加事件或记录)。 (否则我创建一个新用户 - 将其添加到数据库,然后执行之前的步骤)

我的问题是,当我做"collection.save(user)""find(user)"我收到错误 - 无法序列化抽象类。 Per the documentation我应该可以使用“自动映射”功能,所以我认为它可以开箱即用。那太好了。我希望我的db对象像UsersDb类中那样只是我的用户对象的容器。

如果不是 - 是否有适当的“mongodb”容器类可以使用(即使用“List<Session>”来代替“List<Session>”使用 - >BsonList<Session>)?另外我应该如何去实例化我的类中的容器?如果它们是由序列化器生成的,我应该在构造函数中启动它们吗?此外,我怎么能存储在我的班级任意“动态”数据(只是一些普通的json)

我创造这样一个基本的集合:

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

这里是我得到的消息:{“Message”:“发生错误”,“ExceptionMessage”:“无法创建抽象类”,“ExceptionType”:“System.MissingMethodException”,“StackTrace”:“在System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,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 }