BsonDiscriminator属性不起作用? (RegisterClassMap可以)

问题描述 投票:1回答:1

我正在尝试将简单的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声明它是可行的

c# mongodb mongodb-.net-driver
1个回答
0
投票

BsonKnownTypes属性在这里有所不同。请注意,下面的代码之类的代码毫无例外:

var bsonDocument2 = BsonSerializer.Deserialize<Class1>(st);

为什么?因为您将BsonKnownTypes添加到了Class1,但无法对System.Object执行此操作。此外,当您将鼠标悬停在bsonDocument2上时,它的类型将为Class2,这意味着_t会按预期工作。

为什么BsonClassMap.RegisterClassMap<Class2>();可以正常工作?因为它将Class2注册为其所有父类的已知类型,包括objectgithub

© www.soinside.com 2019 - 2024. All rights reserved.