J'ai une classe A et de classe B et CBsonSerializer.Deserialize <T> (bsonDocument) - champ Id d'objet enfant provoque l'exception
public class A
{
public string Id {get;set;}
public List<B> Children {get;set;}
}
public class B
{
public string Id {get;set;}
public string Foo {get;set;}
public double Bar {get;set;}
}
public class C
{
public string Id {get;set;}
//This property will hold a serialized version of Class A.
//The scenario requirement is that it can hold any arbitrary BsonDocument of different types
public BsonDocument Properties {get;set;}
}
var instanceOfClassC = collection.Find(...).First();
var data = BsonSerializer.Deserialize<A>(instanceOfClassC.Properties);
Cette dernière ligne provoque le soufflet d'exception. Si j'ajoute BsonElement à la propriété Id de la classe B, cela fonctionne correctement. Mais j'ai besoin de cette propriété Id!
Exception:
Une exception non gérée du type 'System.FormatException' a eu lieu dans MongoDB.Bson.dll
Informations complémentaires: Une erreur est survenue lors de la désérialisation la propriété Enfants de classe NameSpace.A: L'élément 'Id' ne correspond à aucun champ ou propriété de la classe NameSpace.B.
Une exception non gérée du type « System.FormatException » a eu lieu dans MongoDB.Bson.dll
Le problème semble être que la propriété est B.Id stockée comme « Id » dans MongoDB car il est " sérialisé "à un BsonDocument avant le stockage. Le même modèle fonctionne toujours parfaitement, mais que MongoDb transformera Id => _id au moment de l'écriture.
Condition: classe C.Properties contient des types arbitraires d'autres types de classe valides et ne peut pas être modifié en type A dans la déclaration de classe. Cela fonctionne bien - sauf cette propriété Id imbriquée!
Mise à jour: Recherche d'une solution de piratage brutale: Renommez toutes les propriétés "Id" du fichier BsonDocument en "_id" avant de l'envoyer à MongoDb. Ensuite, la désérialisation fonctionne comme prévu. Je fais cela avec la chaîne de remplacement d'un json json.Replace ("\" Id \ "", "\" _ id \ "")
Quelqu'un a une meilleure solution?