史前史:我有一个从 XML 模式 (XSD) 生成的类层次结构(很大)。
MyObj obj;
现在:我需要解析一个字符串值,它实际上是一个使用生成的类层次结构的对象的 XML,然后我需要将该对象放入 MongoDB。代码是:
private BsonDocument XmlToBson(string content)
{
MyObj obj;
using (var reader = new StringReader(content))
{
var serializer = new XmlSerializer(typeof(MyObj));
obj = (MyObj) serializer.Deserialize(reader);
}
return obj.ToBsonDocument();
}
问题:我在层次结构中有很多空子对象,在 Robomongo 中看起来像这样:
我想避免将空对象添加到数据库中。我知道我可以一一忽略它们,就像这里所描述的 Ignoring Default Values通过使用属性或 lambda 表达式。但由于层次结构庞大而复杂,我不喜欢这种方法。我懒得列出当它们具有空值时必须忽略的所有属性。更重要的是,该类将来可以重新生成,支持必须忽略的属性列表将是一场噩梦。
问题:无论对象在层次结构中的哪个位置,我如何才能实现目标并全局忽略空值?我正在使用 MongoDB C# 驱动程序版本。 2.2.
最佳答案
您可以通过注册约定包在序列化时将大多数属性的效果应用于所有属性。
在 IgnoreIfNullConvention
下方注册,在序列化和反序列化时将 [IgnoreIfNull]
属性隐式应用到所有属性。
var anon = new
{
Foo = "bar",
Baz = (string)null,
};
ConventionRegistry.Register("Ignore",
new ConventionPack
{
new IgnoreIfNullConvention(true)
},
t => true);
var bsonDocument = anon.ToBsonDocument();
这将产生一个仅包含 Foo
键的文档。
如果需要,您还可以在序列化后按名称Remove()
此约定。
关于c# - 如何通过使用 MongoDB C# 驱动程序调用 obj.ToBsonDocument() 来全局忽略空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38747654/