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.InnerExceptionetc. (aussi loin que possible);XmlSerializerest 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>