2013-12-10 11 views
12

Beim Versuch, die Vererbung mit MongoRepository für C# zu kombinieren, treten Serialisierungsfehler auf.MongoRepository Vererbungsserialisierungsfehler

Die wirklich seltsame Sache ist, dass es für eine kurze Zeit funktioniert, aber nach einem Umbau sagen oder etwas, das es scheitert. Wenn ich die Sammlung ablege und eine neue erzeuge, funktioniert sie bis zum Stoppen oder Neuaufbau.

Mein Code sieht so aus:

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

Wenn ich versuche, es zu bekommen:

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

Der Fehler, den ich erhalten ist:

eine Ausnahme vom Typ ‚System. IO.FileFormatException 'trat in MongoDB.Driver.dll auf, wurde jedoch nicht im Benutzercode

verarbeitet

Weitere Informationen: Beim Deserialisieren der People-Eigenschaft der Klasse API.Models.Organization ist ein Fehler aufgetreten: Instanzen abstrakter Klassen können nicht erstellt werden.

Antwort

14

den Dekorateur Hinzufügen Attribute:

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

den Klassen das Problem behoben.

+2

Weitere Informationen zum Arbeiten mit polymorphen Klassen und zur Serilisierung/Deserialisierung finden Sie hier http://docs.mongodb.org/ecosystem/tutorial/serialize-documents-with-the-csharp-driver/#polymorphic-classes-and -Diskriminatoren –

2

Hatte ein ähnliches Problem, wobei Person eine abstrakte Klasse war, die von einer anderen abstrakten Klasse erbte. Ich die Idee nicht mochte die Umsetzung Mongo in meinem Domain-Modell Attribute und nach einem wenig mit ihm hantiert, fand die Person Klasse Anreißen als eine Wurzel macht es serialisiert und deserialisiert richtig:

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

Beachten Sie, dass die Deserialisierung Ausnahme ist aufgetreten, weil Der MongoDB-Treiber hat den Diskriminator _t Feld nicht festgelegt.

Verwandte Themen