Question

Suite à ma récente question sur Objets volumineux et complexes en tant que résultat de service Web.J'ai réfléchi à la façon dont je peux m'assurer que toutes les futures classes enfants soient sérialisables en XML.

Maintenant, je pourrais évidemment mettre en œuvre le IXmlSérialisable interface, puis y ajouter un lecteur/écrivain, mais j'aimerais éviter cela car cela signifie que je dois instancier un lecteur/écrivain chaque fois que je veux le faire, et 99,99 % du temps, je vais travailler avec un chaîne donc je peux juste écrire le mien.

Cependant, pour sérialiser en XML, je décore simplement la classe et ses membres avec le XML ??? les attributs ( Racine XML , ÉlémentXml etc.), puis le transmettons au XmlSérialiseur et un Écrivain de chaînes pour obtenir la chaîne.Ce qui est tout bon.J'ai l'intention de mettre la méthode pour renvoyer la chaîne dans une méthode utilitaire générique afin de ne pas avoir à me soucier du type, etc.

Ce qui me préoccupe c'est ça :Si je ne décore pas la ou les classes avec les attributs requis, une erreur n'est pas générée avant l'exécution.

Existe-t-il un moyen d'appliquer la décoration des attributs ?Est-ce que cela peut être fait avec FxCop ? (Je n'ai pas encore utilisé FxCop)

MISE À JOUR:

Désolé pour le retard pour nous rapprocher les gars, il y a beaucoup à faire !

J'aime vraiment l'idée d'utiliser la réflexion pour le faire dans un scénario de test plutôt que de recourir à FxCop (comme pour tout garder ensemble). Réponse de Fredrik Kalseth C'était fantastique, merci d'avoir inclus le code car il m'aurait probablement fallu un peu de recherche pour comprendre comment le faire moi-même !

+1 aux autres gars pour des suggestions similaires :)

Était-ce utile?

La solution

J'écrirais un test unitaire/d'intégration qui vérifie que toute classe correspondant à certains critères donnés (c'est-à-dire la sous-classe X) est décorée de manière appropriée.Si vous configurez votre build pour qu'il s'exécute avec des tests, vous pouvez faire échouer la build lorsque ce test échoue.

MISE À JOUR:Vous avez dit : « On dirait que je vais simplement devoir retrousser mes manches et m'assurer que les tests unitaires sont maintenus collectivement » - vous n'êtes pas obligé de le faire.Écrivez simplement une classe de test générale qui utilise la réflexion pour trouver toutes les classes qui doivent être affirmées.Quelque chose comme ça:

[TestClass]
public class When_type_inherits_MyObject
{
    private readonly List<Type> _types = new List<Type>();

    public When_type_inherits_MyObject()
    {
        // lets find all types that inherit from MyObject, directly or indirectly
        foreach(Type type in typeof(MyObject).Assembly.GetTypes())
        {
            if(type.IsClass && typeof(MyObject).IsAssignableFrom(type))
            {
                _types.Add(type);
            }
        }
    }

    [TestMethod]
    public void Properties_have_XmlElement_attribute
    {
        foreach(Type type in _types)
        {
            foreach(PropertyInfo property in type.GetProperties())
            {
                object[] attribs = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
                Assert.IsTrue(attribs.Count > 0, "Missing XmlElementAttribute on property " + property.Name + " in type " + type.FullName);
            }
        }
    }
}

Autres conseils

Vous pouvez écrire des tests unitaires pour vérifier ce genre de chose – cela utilise essentiellement la réflexion.

Étant donné que cela est possible, je suppose qu'il serait également possible d'écrire une règle FxCop, mais je n'ai jamais fait une telle chose.

Vous pouvez écrire une règle FxCop ou même vérifier les attributs en appelant GetType() dans le constructeur de la classe de base et en réfléchissant sur le type renvoyé.

Une bonne règle FXCop (et dont je trouve que j'ai besoin en ce moment) serait de vérifier que tous les objets ajoutés à la session ASP.NET ont l'attribut Serialisable.J'essaie de passer de l'état de session InProc à SQL Server.La première fois que j'ai demandé une page, mon site m'a explosé parce que des objets non sérialisables étaient stockés dans Session.Vint ensuite la tâche de parcourir tout le code source à la recherche de chaque instance où un objet est défini dans la session...FXCop serait une bonne solution.Quelque chose à travailler...

Vous pouvez également utiliser ce concept/post-processeur pour appliquer des relations entre les attributs et utiliser une connexion similaire pour appliquer des relations entre les classes et les attributs au moment de la compilation :

http://www.st.informatik.tu-darmstadt.de/database/publications/data/cepa-mezini-gpce04.pdf?id=92

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top