1
votes

Gérer null lors de la sérialisation de la classe en xml en C #

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.


8 commentaires

"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'exceptions


voici un résumé mis à jour qui utilise votre méthode Serialize et utilise une List 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ées


Dictionary 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>


3 Réponses :


-1
votes

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  


        }  
    } 


0 commentaires

2
votes

2 commentaires

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



0
votes

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).


0 commentaires