Domanda

In seguito alla mia recente domanda su Oggetti grandi e complessi come risultato di un servizio Web.Ho pensato a come garantire che tutte le future classi figlie siano serializzabili in XML.

Ora, ovviamente, potrei implementare il file IXmlSerializzabile e poi inserirvi un lettore/scrittore, ma vorrei evitarlo poiché significa che devo istanziare un lettore/scrittore ogni volta che voglio farlo, e il 99,99% delle volte lavorerò con un corda quindi potrei semplicemente scrivere il mio.

Tuttavia, per serializzare in XML, sto semplicemente decorando la classe e i suoi membri con il file XML??? attributi ( XmlRoot , XmlElement ecc.) e poi passandolo al file XmlSerializer e un StringWriter per ottenere la corda.E va tutto bene.Intendo inserire il metodo per restituire la stringa in un metodo di utilità generico, quindi non devo preoccuparmi del tipo, ecc.

Ciò che mi preoccupa è questo:Se non decoro le classi con gli attributi richiesti, non viene generato un errore fino al momento dell'esecuzione.

Esiste un modo per applicare la decorazione degli attributi?È possibile farlo con FxCop? (Non ho ancora usato FxCop)

AGGIORNAMENTO:

Ci scusiamo per il ritardo nell'avvicinarci ragazzi, c'è molto da fare!

Sicuramente mi piace l'idea di utilizzare la riflessione per farlo in un caso di prova piuttosto che ricorrere a FxCop (mi piace tenere tutto insieme). La risposta di Fredrik Kalseth è stato fantastico, grazie per aver incluso il codice perché probabilmente mi ci sarebbe voluto un po' di ricerca per capire come farlo da solo!

+1 agli altri ragazzi per suggerimenti simili :)

È stato utile?

Soluzione

Scriverei un test di unità/integrazione che verifichi che qualsiasi classe che corrisponda ad alcuni criteri specificati (ad esempio la sottoclasse X) sia decorata in modo appropriato.Se imposti la build per l'esecuzione con i test, è possibile che la build fallisca quando questo test fallisce.

AGGIORNAMENTO:Hai detto: "Sembra che dovrò semplicemente rimboccarmi le maniche e assicurarmi che i test unitari siano mantenuti collettivamente" - non è necessario.Basta scrivere una classe di test generale che utilizzi la riflessione per trovare tutte le classi che devono essere affermate.Qualcosa come questo:

[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);
            }
        }
    }
}

Altri suggerimenti

Puoi scrivere test unitari per verificare questo genere di cose: fondamentalmente utilizza la riflessione.

Dato che ciò è possibile, immagino che sarebbe anche possibile scrivere una regola FxCop, ma non ho mai fatto una cosa del genere.

Puoi scrivere una regola FxCop o anche verificare gli attributi chiamando GetType() nel costruttore della classe base e riflettendo sul tipo restituito.

Una buona regola FXCop (e quella che sto scoprendo di aver bisogno in questo momento) sarebbe quella di verificare che tutti gli oggetti aggiunti alla sessione ASP.NET abbiano l'attributo Serializable.Sto cercando di passare dallo stato della sessione InProc a SQL Server.La prima volta che ho richiesto una pagina, il mio sito mi è esploso perché nella Session venivano archiviati oggetti non serializzabili.Poi è arrivato il compito di frugare in tutto il codice sorgente cercando ogni istanza in cui un oggetto è impostato nella Sessione...FXCop sarebbe una bella soluzione.Qualcosa su cui lavorare...

Puoi anche utilizzare questo concetto/post-processore per rafforzare le relazioni tra attributi e utilizzare un accesso simile per rafforzare le relazioni tra classi e attributi in fase di compilazione:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top