2017-06-01 2 views
0

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?

Répondre

0

Une solution plus propre serait:

public class A 
{ 
    public string Id {get;set;} 
    public List<B> Children {get;set;} 
} 
[BsonNoId] // this solves the problem 
public class B 
{ 
    public string Id {get;set;} 
    public string Foo {get;set;} 
    public double Bar {get;set;} 
} 

Vous pouvez aussi le faire sans attribut, en utilisant le BsonClassMap:

BsonClassMap.RegisterClassMap<B>(cm => 
{ 
    cm.SetIdMember(null); 
}); 

Ce qui est usful si les types que vous êtes cartographie sont d'un bibliothèque différente