MongoRepository继承序列化错误

时间:2013-12-10 14:31:44

标签: c# mongodb serialization mongorepository

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

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

我的代码如下:

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属性时发生错误:无法创建抽象类的实例。

2 个答案:

答案 0 :(得分:14)

添加装饰器属性:

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

解决了这个问题。

答案 1 :(得分:2)

有一个类似的问题,其中Person是一个继承自另一个抽象类的抽象类。我不喜欢将Mongo属性放在我的域模型中的想法,在稍微弄清楚它之后,发现将Person类标记为root使其正确序列化和反序列化:

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

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