将复杂对象序列化为mongoDB

时间:2013-05-30 11:09:25

标签: c# mongodb serialization mongodb-.net-driver

我有几个密切相关的问题,所以我在这个问题下对它们进行分组。

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

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

如果没有 - 是否有合适的&#34; mongodb&#34;我可以使用的容器类(即代替&#34; List<Session>&#34;使用 - &gt; BsonList<Session>)?另外我应该如何在我的类中实例化容器?如果它们是由序列化程序生成的,我应该在构造函数中启动它们吗?另外我如何存储任意的&#34;动态&#34;我的课程中的数据(只是一些常规的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; }
}

1 个答案:

答案 0 :(得分:0)

您无法反序列化动态。为了使用真正的课程,你需要有更严格的东西。

可能需要采取以下解决方法:

[BsonKNownTypes(typeof(Implementation1))]
[BsonKNownTypes(typeof(Implementation2))]
public class DynamicModelHere {}
public class Implementation1 : DynamicModelHere { property, property, property }
public class Implementation2 : DynamicModelHere { property, property, property }