9
votes

XmlSerializer, suffixe "spécifié" et ifflect

J'ai découvert que si un champ Serializable dispose d'un champ correspondant de type boolean ayant comme nom le champ le champ Nom avec suffixe "spécifié", le xmlSerializer excluent conditionnellement que champ / propriété du processus de sérialisation. Nice!

Donc, je veux éviter la définition de ces champs et les ajouter de manière dynamique, à l'exécution ...

lire Ce , J'ai trouvé une interface intéressante IREFLect < / a>, que je peux utiliser pour "émuler" des champs dynamiques utilisés par les instances XMLSerializer pour exclure certains champs.

cela fonctionnerait-il?


2 commentaires

Pouvez-vous commenter pourquoi vous voulez éviter ces champs et faire cela au moment de l'exécution? Voulez-vous sérialiser des classes différemment en fonction des valeurs calculées d'exécution ou que vous souhaitez simplement éviter d'ajouter ces propriétés supplémentaires?


Ceci est incroyable: les auteurs-cadres ont en réalité la codée dans les profondeurs du moteur de réflexion du sérielizer XML. Quelle décision de conception! Où est-ce documenté? référencesSource.microsoft.com/#system.xml/ Système / XML / ...


3 Réponses :


2
votes

Si vous souhaitez prendre le contrôle de votre sérialisation XML, vous avez deux options. Le premier (qui pourrait ne pas être approprié ici) il utilisera les attributs dans l'espace de noms System.xml.Sérialization pour exclure les propriétés. Si vous avez vraiment besoin de déterminer ce qui est sérialisé au moment de l'exécution, cela pourrait ne pas être le meilleur plan d'action.

voir Attributs qui contrôlent la sérialisation XML

L'autre moyen de faire cela consiste à implémenter l'interface IXMLLSerializable sur votre classe et à mettre en œuvre les méthodes ReadexML et WRITEXML. Cela vous permet de prendre le contrôle de votre apparence XML. Voir cette question pour des informations supplémentaires:

sérialisation XML personnalisée

Cependant, comme mentionné ici sérialisation personnalisée et de base? une fois que vous avez implémenté ixmlSerializable Vous êtes responsable de toute la logique de sérialisation pour votre type.


2 commentaires

S'il vous plaît ne postez pas de liens .net 1.1 Sauf demande explicite.


Merci d'avoir accepté la réponse. Wow! Je viens de réaliser qu'il y a presque 1 an que j'ai répondu :-)



4
votes

Je vais étendre la réponse de Martin Peck em>. Vous pouvez éviter la sérialisation des champs / propriétés avec un suffixe "spécifié". Vous devez définir ces propriétés "* spécifiées" dans votre classe et appliquer [xmlignoreattribute ()] code> à eux.

Voici un exemple: p>

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://yournamespace.com")]
public partial class YourObject
{
    private long sessionTimeoutInSecondsField;

    private bool sessionTimeoutInSecondsFieldSpecified;

    public long sessionTimeoutInSeconds
    {
        get
        {
            return this.sessionTimeoutInSecondsField;
        }
        set
        {
            this.sessionTimeoutInSecondsField = value;
        }
    }

    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool sessionTimeoutInSecondsSpecified
    {
        get
        {
            return this.sessionTimeoutInSecondsFieldSpecified;
        }
        set
        {
            this.sessionTimeoutInSecondsFieldSpecified = value;
        }
    }
}


1 commentaires

Vous obtenez uniquement l'utilisation de getter pour * spécifié de propriété et ne devez pas définir xmlignore .



0
votes

échantillon de code en tant qu'extension de la réponse fournie;

WSDL: P>

<advancedSearchRequests>
 <vehicleType>BIKE</vehicleType>
 <search>abc</search>
</advancedSearchRequest>


0 commentaires