MongoRepository inheritance serialization error

3.1k views Asked by At

When trying to combine inheritance with MongoRepository for C# I am experiencing serialization errors.

The really odd thing is it works for a short time but after say a rebuild or something it fails. If I drop the collection and create a new one it will work until a stop or rebuild.

My code looks like:

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;}
}

When I try to get it like:

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

The error I receive is:

An exception of type 'System.IO.FileFormatException' occurred in MongoDB.Driver.dll but was not handled in user code

Additional information: An error occurred while deserializing the People property of class API.Models.Organization: Instances of abstract classes cannot be created.

2

There are 2 answers

1
amcdnl On BEST ANSWER

Adding the decorator attributes:

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

to the classes resolved the issue.

0
bklaric On

Had a similar problem, where Person was an abstract class inheriting from another abstract class. I disliked the idea of putting Mongo attributes in my domain model and after fiddling a bit with it, found out marking the Person class as a root makes it serialize and deserialize properly:

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

Note that the deserialization exception occurred because the MongoDB driver was not setting the discriminator _t field.