2013-12-10 1 views
12

C# 용 MongoRepository와의 상속을 시도 할 때 직렬화 오류가 발생합니다.MongoRepository 상속 직렬화 오류

정말 이상한 점은 짧은 시간 동안 작동하지만 재구성 또는 무언가가 실패한 후입니다. 컬렉션을 삭제하고 새 컬렉션을 만들면 중지 또는 다시 작성할 때까지 작동합니다. 내가받을

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

오류는 다음과 같습니다 :

유형의 예외를 '시스템

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

내가 그것을 좋아 얻을 때 : 같은

내 코드 보인다. IO.FileFormatException 'MongoDB.Driver.dll에서 발생했지만 사용자 코드에서 처리하지 않았습니다.

추가 정보 : API.Models.Organization 클래스의 People 속성을 deserialize하는 동안 오류가 발생했습니다. 추상 클래스의 인스턴스는 만들 수 없습니다.

답변

14

데코레이터를 추가하면 속성 : 클래스에

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

문제를 해결.

+2

다형성 클래스 작업 및 serilizing/deserialization에 대한 자세한 내용은 http://docs.mongodb.org/ecosystem/tutorial/serialize-documents-with-the-csharp-driver/#polymorphic-classes-and에서 확인할 수 있습니다. - 구분자 –

2

Person이 다른 추상 클래스를 상속하는 유사한 문제가 발생했습니다. 역 직렬화 예외가 있기 때문에 발생했음을

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

참고 : 나는 몽고 내 도메인 모델과 함께 조금 하구 후 속성 퍼팅의 아이디어를 싫어 루트가 직렬화 제대로 역 직렬화 수로 Person 클래스를 표시 발견 MongoDB 드라이버가 판별 자 _t 필드를 설정하지 않았습니다.