我正在尝试将简单的JSON字符串序列化为BsonDocument:
var st = @"{ ""_t"" : ""Class2"", ""aaa"" : 2 }";
var bsonDocument2 = BsonSerializer.Deserialize<object>(st);
Console.WriteLine(bsonDocument2);
Class2
继承自Class1
的地方:
[BsonKnownTypes(typeof(Class2))]
[BsonDiscriminator(Required = true)]
public class Class1
{
}
[BsonDiscriminator("Class2")]
public class Class2 : Class1
{
[BsonElement("aaa")]
[BsonRepresentation(BsonType.Int32)]
public int AAA { get; set; }
}
[请注意,我确实使用了[BsonDiscriminator("Class2")]
,但仍然出现错误:
未知标识符值'Class2'。
但是,如果我使用BsonClassMap.RegisterClassMap<Class2>();
,则不会出现异常,并且都可以使用
但是我不想使用代码,而是一个属性。
问题:
为什么使用属性时会出现异常?
docs声明它是可行的
BsonKnownTypes
属性在这里有所不同。请注意,下面的代码之类的代码毫无例外:
var bsonDocument2 = BsonSerializer.Deserialize<Class1>(st);
为什么?因为您将BsonKnownTypes
添加到了Class1
,但无法对System.Object
执行此操作。此外,当您将鼠标悬停在bsonDocument2
上时,它的类型将为Class2
,这意味着_t
会按预期工作。
为什么BsonClassMap.RegisterClassMap<Class2>();
可以正常工作?因为它将Class2
注册为其所有父类的已知类型,包括object
(github)