공식 C# 드라이버를 사용하여 mongodb의 비 제너릭 기본 클래스에서 상속 된 일반 클래스의 개체 목록을 저장하려고합니다.MongoDB 일반 클래스가 아닌 일반 클래스를 가진 C# 드라이버 유형 식별자가
내 코드는 다음과 같습니다
abstract class MyAbstractClass {}
class MyGenericClass<T>: MyAbstractClass
{
[BsonRequired]
public List<T> Values = new List<T>();
public MyGenericClass(IEnumerable<T> values)
{
Values.AddRange(values);
}
}
class MyContainerClass
{
[BsonId]
public string Id;
[BsonRequired]
public List<MyAbstractClass> ValueCollections = new List<MyAbstractClass>();
public MyContainerClass()
{
Id = Guid.NewGuid().ToString();
}
}
테스트, I는 컨테이너 객체를 만들고 같은, 일반 클래스의 인스턴스와 그것을 채울 때 :
var container = new MyContainerClass();
container.ValueCollections.Add(new MyGenericClass<string>(new[]{"foo","bar","baz"}));
나는이를 저장하면 DB를이 문서는 다음과 같이 추가 :
{
"_id": "c5cf5cd1-843f-4d5d-ba8f-5859ae62fd1d",
"ValueCollections": [
{
"_t": "MyGenericClass`1",
"Values": [
"foo",
"bar",
"baz"
]
}
]
}
유형 판별 입력 얻는다 "을 MyGener "MyGenericClass'1 [System.String]"대신 "icClass'1"을 사용하면 다시 deserialize 할 수 없습니다.
또한 DB에서 이러한 개체를로드하려고하면 오류 메시지가 나타납니다. 추상 클래스의 인스턴스를 만들 수 없습니다. 그러나 유형 판별 자 (올바른 경우)는 드라이버가 MyAbstractClass 유형이지만 MyGenericClass 유형의 객체를 생성하지 않아야 함을 알 수 있어야합니다.
내 질문은 다음과 같습니다. 1.이 오류가 발생하는 이유는 무엇입니까? 2. 왜 discriminator를 올바르게 직렬화하지 않습니까?
감사합니다.