12
votes

Serialise Bool? Erreur réfléchissant le type

J'ai une classe comme xxx pré>

mais cela sérialise la valeur du bool sur false lorsque l'attribut n'est pas présent dans le XML. Lorsque l'attribut n'est pas dans le XML, je veux que la propriété soit nulle. P>

donc j'ai essayé ce p> xxx pré>

mais alors les erreurs de sérialisation p >

Type t = Type.GetType("Assembly.NameSpace.MyClass");
                XmlSerializer mySerializer = new XmlSerializer(t); //error "There was an error reflecting type"


0 commentaires

4 Réponses :


1
votes

Le problème est qu'un type nullable doit être défini comme un élément (qui est par défaut) et non d'attribuer.

raison est lorsque la valeur est null, elle peut être représentée comme < Code> comme tel ne peut pas être représenté comme attribut .

regarder cet extrait: xxx

et: xxx

sortie: xxx


1 commentaires

Merci, mais c'est l'attribut dans le XML que je reçois, je ne peux pas contrôler cela. Y a-t-il un moyen d'avoir un attribut Bool nullable?



10
votes

Vous devez utiliser le modèle de champ "* spécifié" pour contrôler ceci (voir "Contrôler XML généré XML" sur MSDN ):

[Serializable]
public class MyClass
{
    [XmlAttribute]
    public bool myBool { get; set; }

    [XmlIgnore]
    public bool myBoolSpecified;
}
  • si ! myBoolSpecified code>, puis mybool code> est logiquement null code> li>
  • d'autres utilise le true code> ou false code> de mybool code> li> ul> p>


6 commentaires

@Aliostad: J'apprécie les mérites de votre approche, mais si la structure XML n'est pas ouverte à la modification, cela ne fonctionnera pas pendant que celui-ci le fera.


Cela semble super mais ne semble pas fonctionner. Est le "{} spécifié" un nom magique? Ai-je besoin d'une certaine logique dans le getter?


@Jules: Oui, c'est un nom magique. Recherchez "Le modèle est créé dans le formulaire de biensNamesPeecified" sur la page liée. Si cela ne fonctionne pas, veuillez indiquer votre code actuel.


J'ai un problème avec ça. Tandis que cela laisse l'attribut lors de la désérialisation, cela ne sérialiste pas la propriété à un attribut lorsque la propriété a une valeur. J'ai besoin de la solution pour travailler dans les deux sens.


@Jules: Je ne suis pas sûr de ce que tu veux dire. Quelle est la valeur de la propriété et du champ lorsque vous serialisez-vous?


J'ai aussi un vrai problème avec cela. C'est une majeure dans le sérieliseur. Nous pouvons donc sérialiser des entiers nullables, mais nous ne pouvons pas sérialiser les nullables bools? Folie.



3
votes

regarder Ce pour des informations sur le traitement des champs nullables et des attributs XML. Il y a une similaire Question ici trop. Fondamentalement, le sérialiseur ne peut pas gérer un champ d'attribut XML défini comme nullable, mais il y a une solution autour de la valeur.

Ie 2 propriétés, une qui contient la nullable (non stockée XML) et l'autre utilisée dans la lecture / l'écriture (Attribut XML stocké sous forme de chaîne). Cela pourrait peut-être être ce dont vous avez besoin? P>

private bool? _myBool;
[XmlIgnore]
public bool? MyBool
{
    get
    {
        return _myBool;
    }
    set
    {
        _myBool = value;
    }
}

[XmlAttribute("MyBool")]
public string MyBoolstring
{
    get
    {
        return MyBool.HasValue
        ? XmlConvert.ToString(MyBool.Value)
        : string.Empty;
    }
    set
    {
        MyBool =
        !string.IsNullOrEmpty(value)
        ? XmlConvert.ToBoolean(value)
        : (bool?)null;
    }
}


0 commentaires

1
votes

Vous pouvez utiliser xmelementattribute. Islamllable : xxx


1 commentaires

Qui n'est ponctuable que lorsque vous pouvez choisir de sérialiser en tant qu'élément, au lieu d'un attribut