0
votes

C # Mongodb Serialization Conversion Propriété "ReadbsOntype ne peut être appelée que lorsque l'état est de type, et non lorsque l'état est de la valeur".

J'ai un modèle que j'essaie de désérialiser, le problème est que sur l'une des propriétés, c'est parfois une chaîne et parfois un document. J'ai donc décidé d'écrire un sérialiseur personnalisé qui s'appuie sur SerializerAsBase. Cependant, il semble y avoir un bug dans le cadre. Lors du remplacement de la méthode de désérialisze, je reçois toujours l'exception "LisecharbSonType ne peut être appelé que lorsque l'état est de type, pas lorsque l'état est de la valeur."

J'utilise .NET Framework 4.6.2 et toutes les versions de mes bibliothèques de Mongo sont 2.8.0 P>

Il s'agit d'une version simplifiée de ma classe et de la façon dont je la mettez en la mise en œuvre. P>

public class FormData
{
    [BsonId]
    public string Id { get; set; }

    [BsonSerializer(typeof(MyClassSerializer))]
    public string Data { get; set; }
}


4 commentaires

D'où vient l'exception, quelle ligne de code? Avez-vous regardé Stackoverflow.com/questions/42336751/Custom-Desérialization et mongodb.github.io/mongo-csharp-driver/2.2/2Reference / BSON / ...


Bonjour Jon, j'ai vu cela, j'ai effectivement adopté mon code de cet exemple. Mais même la mise en œuvre comme l'affiche, je reçois toujours l'exception. J'ai mis à jour mon message pour inclure la trace de pile afin que vous puissiez voir où dans le cadre, il appelle mon code.


Je ne vois pas myClassserializer nulle part dans cette trace de pile? Est-ce le tout?


Je crois que c'est parce que "désériializemembervalue" du cadre appelle mon code et l'exception est lancée après que ma méthode revienne déjà


3 Réponses :


0
votes

Qu'en est-il de changer votre classe à un objet? J'ai eu un problème similaire et ça marche. XXX


1 commentaires

Merci pour le commentaire Rogerio, il a dépassé l'erreur, mais est automatiquement converti en une microsine . Cela seraient certainement une solution de contournement, mais ne voudrait pas avoir d'étapes post-désériorialisation à effectuer. Aussi, aimerait savoir comment résoudre ceci au cas où je suis obligé d'utiliser un sérialiseur personnalisé



0
votes

J'ai fini par écrire le sérialisateur pour le modèle lui-même au lieu de la propriété spécifique et cela fonctionne maintenant.


1 commentaires

Pourriez-vous partager plus de détails sur votre solution s'il vous plaît?



1
votes

Utilisez ce code

public class MyClass {
public ObjectId Id { get; set; }
[BsonSerializer(typeof(MyCustomStringSerializer))]
public string X { get; set; }
}

BsonClassMap.RegisterClassMap<MyClass>(cm => {
cm.AutoMap();
cm.GetMemberMap(c => c.X).SetSerializer(new MyCustomStringSerializer());
});


1 commentaires

Bonjour et bienvenue à Stackoverflow, et merci d'avoir répondu. Bien que ce code puisse répondre à la question, pouvez-vous envisager d'ajouter des explications à ce que le problème était résolu et comment vous l'avez résolu? Cela aidera les futurs lecteurs à mieux comprendre votre réponse et en apprendre.