J'essaye de sérialiser une classe en C # cela fonctionne bien quand il n'y a pas de valeur nulle dans l'objet. Voici la classe
public static string Serialize<T>(T toSerialize) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); using (StringWriter textWriter = new StringWriter()) { xmlSerializer.Serialize(textWriter, toSerialize); return textWriter.ToString(); } }
Lorsque je fournis la valeur suivante, cela fonctionne très bien.
EnquiryResponseInfo tt = new EnquiryResponseInfo() { EnquiryId = "xxx", Enquiry = new EnquiryViewModel() { Name = "Test user", Address = "Test Address" } }
Mais quand Enquête est nul, il ne sérialise pas. J'ai une condition où l ' Enquiry sera nul mais il y aura une valeur dans le EnquiryId là-bas.
Voici la méthode pour sérialiser la classe.
public class EnquiryResponseInfo { public string EnquiryId { get; set; } public EnquiryViewModel Enquiry { get; set; } }
Veuillez aider.
3 Réponses :
conservez votre propriété comme nullable, ce qui résoudrait le problème. Exemple de code que vous pouvez consulter ci-dessous.
[XmlRoot("test")] public class Test { int? propertyInt; string propertyString; [XmlAttribute("property-int")] public int PropertyInt { get { return (int)propertyInt; } set { propertyInt = (int)value; } } public bool PropertyIntSpecified { get { return propertyInt != null; } } [XmlAttribute("property-string")] public string PropertyString { get { return propertyString; } set { propertyString = value; } } } class Program { static void Main(string[] args) { XmlSerializer serializer = new XmlSerializer(typeof(Test)); serializer.Serialize(Console.Out, new Test() { PropertyInt = 3 }); //only int will be serialized serializer.Serialize(Console.Out, new Test() { PropertyString = "abc" }); // only string will be serialized serializer.Serialize(Console.Out, new Test() { PropertyInt = 3, PropertyString = "abc" }); // both - int and string will be serialized } }
Essayez de décorer la propriété Demande avec
[XmlElement (IsNullable = true)]
Cité de ici p>
Je comprends que maintenant, je pense que l'utilisation de cette valeur est d'empêcher le sérialiseur de sérialiser la valeur si elle est nulle, n'est-ce pas? @MarcGravell
non, pas vraiment; il le fait déjà - cela le fait juste être sérialisé d'une manière spécifique lorsqu'il est nul, c'est-à-dire exprimé en xml comme un nul
Le code indiqué dans la question et les commentaires convient parfaitement ; XmlSerializer
a des comportements par défaut raisonnables avec null
, donc: ce n'est pas le problème.
Quoi qu'il se passe : il n'est pas affiché dans la question. Très probablement, il existe d'autres propriétés sur EnquiryViewModel
qui ne sont pas compatibles avec XmlSerializer
- il s'agit peut-être de types non publics ou de constructeur sans paramètre public. Le moyen de le savoir est de regarder les exceptions imbriquées - par exemple, dans Serialize
:
try { // ... what you had before } catch (Exception ex) { while (ex != null) { Debug.WriteLine(ex.Message); ex = ex.InnerException; } throw; }
Cela devrait vous dire ce qu'il trouve exactement répréhensible à propos du modèle, dans la sortie de débogage (ou simplement mettre un point d'arrêt sur la ligne Debug.WriteLine
, et tout lire des messages dans le débogueur).
"Mais lorsque l'enquête est nulle, elle ne se sérialise pas." - L'enquête ne sérialise pas? ou le type entier ne sérialise pas? cela devrait fonctionner correctement si la propriété est nulle - que se passe-t-il exactement? exemple montrant que cela fonctionne correctement, avec la sortie: gist.github.com/mgravell/bd817bebd0f4a3d52c5edf
List ApplicationInfo = new List () {new EnquiryResponseInfo () {EnquiryId = "e30a092d-b7c1-4516-8e48-50efe307c7e5", Inquiry = null}};
Une erreur s'est produite dans le type «System.Collections.Generic.List» 1 [EnquiryResponseInfo] ». Me donne cette erreur ...
"Il y a eu une erreur reflétant le type 'System.Collections.Generic.List`1 [EnquiryResponseInfo]'" - conseil: regardez
.InnerException
- et.InnerException.InnerException
etc. (aussi loin que possible);XmlSerializer
est en fait vraiment bon pour vous dire ce qui ne va pas, mais il se trouve souvent à quelques niveaux dans la pile d'exceptionsvoici un résumé mis à jour qui utilise votre méthode
Serialize
et utilise uneList
pour faire correspondre le message / les commentaires: gist.github.com/mgravell/503a885c291a4eeee2be201473059f75 - cela fonctionne bien - donc: quel que soit le problème, cela n'est pas dans la question ; vous devez soit publier suffisamment de code pour que nous puissions reproduire le problème, soit consulter les exceptions imbriquéesDictionary dd = new Dictionary (); ce n'est pas un copain sérialisé ...
littéralement, rien dans la question n'utilise
Dictionary
- pouvez-vous montrer cela dans son contexte complet?voir aussi: stackoverflow.com/questions/2911514/… < / a>