12

当尝试将继承与 C# 的 MongoRepository 结合时,我遇到了序列化错误。

真正奇怪的是它工作了很短的时间,但在说重建或失败之后。如果我删除该集合并创建一个新集合,它将一直有效,直到停止或重建。

我的代码如下所示:

public class Organization
{
      // other attributes removed for demonstration simplicity

      public List<Person> People { get;set; }
}

public abstract class Person
{
      public string Id {get;set;}
      public string Name {get;set;}
}

public class Employee : Person 
{
      public string Badge {get;set;}
}

public class Contractor : Person
{
     public string Company {get;set;}
}

当我尝试得到它时:

static MongoRepository<Organization> apps = new MongoRepository<Organization>();
return apps.Single(c => c.Id == id);

我收到的错误是:

MongoDB.Driver.dll 中出现“System.IO.FileFormatException”类型的异常,但未在用户代码中处理

附加信息:反序列化类 API.Models.Organization 的 People 属性时出错:无法创建抽象类的实例。

4

2 回答 2

14

添加装饰器属性:

[BsonKnownTypes(typeof(Contractor), typeof(Employee))]

上课解决了这个问题。

于 2013-12-10T14:37:14.463 回答
2

有一个类似的问题,Person从另一个抽象类继承的抽象类在哪里。我不喜欢将 Mongo 属性放在我的域模型中的想法,并且在稍微摆弄了一下之后,发现将Person类标记为根可以使其正确序列化和反序列化:

BsonClassMap.RegisterClassMap<Person>(cm => {
    cm.SetIsRootClass(true);
});

请注意,发生反序列化异常是因为 MongoDB 驱动程序未设置鉴别器_t字段。

于 2016-09-07T08:02:08.363 回答