将复杂对象序列化到mongoDB
本文关键字:mongoDB 序列化 对象 复杂 | 更新日期: 2023-09-27 18:16:08
我有几个问题是密切相关的,所以我把它们归类在这个问题下。
我试图使用c#和mongoDB驱动程序和数据库为我的对象模型创建一个持久的db。我希望能够存储所有的用户对象——在这些用户中应该是会话(一个"列表"或类似的数据结构),并且在每个会话中是他们创建的不同事件和记录(也是列表)。当发出一个新请求时——最初我通过其标识符查找用户。如果它存在,我创建一个会话对象。将该会话对象添加到用户的会话列表中,然后进行适当的更新(向会话添加事件或记录)。(否则我创建一个新用户-将其添加到数据库,然后执行前面的步骤)
我的问题是,当我做"collection.save(user)"
或"find(user)"
我得到错误-不能序列化抽象类。根据文档,我应该能够使用"自动映射"功能,所以我认为它会开箱即用。那太好了。我希望我的数据库对象显示为只是一个容器为我的用户对象是在UsersDb类。
如果没有-是否有适当的"mongodb"容器类我可以使用(即,而不是"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; }
My session class
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; }
}
不能动态反序列化。为了使用真正的类,你需要一些更严格的东西。
可能下面的解决方法是合适的:
[BsonKNownTypes(typeof(Implementation1))]
[BsonKNownTypes(typeof(Implementation2))]
public class DynamicModelHere {}
public class Implementation1 : DynamicModelHere { property, property, property }
public class Implementation2 : DynamicModelHere { property, property, property }