MongoDb collection personnalisée sérialiseur
J'ai quatre classes
public class Zoo{
public ObjectId Id { get; set; }
public List<Animal> Animals { get; set; }
}
public class Animal{
public ObjectId Id { get; set; }
public string Name { get; set; }
}
public class Tiger : Animal{
public double Height { get; set; }
}
public class Zebra : Animal{
public long StripesAmount { get; set; }
}
J'ai créé la coutume sérialiseur qui me permet de stocker l'Animal objet d'une collecte distincte ("animaux").
class MyAnimalSerializer : SerializerBase<Animal>
{
public override void Serialize(MongoDB.Bson.Serialization.BsonSerializationContext context, MongoDB.Bson.Serialization.BsonSerializationArgs args, Animal value)
{
context.Writer.WriteStartDocument();
context.Writer.WriteName("_id");
context.Writer.WriteObjectId(ObjectId.GenerateNewId());
context.Writer.WriteName("_t");
context.Writer.WriteString(value.GetType().Name);
context.Writer.WriteName("Name");
context.Writer.WriteString(value.Name);
switch (value.AnimalType)
{
case AnimalType.Tiger:
context.Writer.WriteName("Height");
context.Writer.WriteDouble((value as Tiger).Height);
break;
case AnimalType.Zebra:
context.Writer.WriteName("StripesAmount");
context.Writer.WriteInt32((value as Zebra).StripesAmount);
break;
default:
break;
}
context.Writer.WriteEndDocument();
}
public override Animal Deserialize(MongoDB.Bson.Serialization.BsonDeserializationContext context, MongoDB.Bson.Serialization.BsonDeserializationArgs args)
{
context.Reader.ReadStartDocument();
ObjectId id = context.Reader.ReadObjectId();
string object_type = context.Reader.ReadString();
string animal_name = context.Reader.ReadString();
switch (object_type)
{
case "Tiger":
double tiger_height = context.Reader.ReadDouble();
context.Reader.ReadEndDocument();
return new Tiger()
{
Id = id,
Name = animal_name,
Height = tiger_height
};
default:
long zebra_stripes = context.Reader.ReadInt64();
context.Reader.ReadEndDocument();
return new Zebra()
{
Id = id,
Name = animal_name,
StripesAmount = zebra_stripes
};
}
return null;
}
}
Qui fonctionne bien et me permet aussi des choses comme ça:
MongoDB.Bson.Serialization.BsonSerializer.RegisterSerializer(typeof(Animal), new MyAnimalSerializer());
IMongoCollection<Animal> collection = db.GetCollection<Animal>("animals");
var lst = await collection.Find<Animal>(new BsonDocument()).ToListAsync();
Mais je ne peut pas faire le même, quand Animaux sont stockés dans le Zoo de
et ne peut pas désérialiser Zoo de Zoo collection:
IMongoCollection<Zoo> collection = db.GetCollection<Zoo>("zoocollection");
var lst = await collection.Find<Zoo>(new BsonDocument()).ToListAsync(); //not working here
Est-il possible de créer une collection personnalisée de sérialiseur pour le domaine?
public List<Animal> Animals { get; set; }
Quelqu'un pourrait-il donner un exemple?
Merci à l'avance.
OriginalL'auteur Ivan Talalaev | 2015-05-24
Vous devez vous connecter pour publier un commentaire.
Avez-vous visité ce document page? Il existe aussi des exemples de classes polymorphes.
Voici mon exemple de stocker des objets:
Ici est de savoir comment les objets ont été stockées dans la base de données (Robomongo)
Et le résultat final :
OriginalL'auteur Anton Putau
Merci beaucoup Anton Putau pour la plus simple solution possible.
Mais il en est une autre. Pour sérialiser des objets manuellement:
Et seulement vous avez à annoter le IEnumerable champ d'utilisation de votre sérialiseur:
OriginalL'auteur Ivan Talalaev