Pregunta

A raíz de mi reciente de la cuestión en Grandes, Objetos Complejos como un Servicio Web Resultado.He estado pensando acerca de cómo puedo asegurarme de que todas las futuras clases hijas son serializables a XML.

Ahora, obviamente, yo podría implementar el IXmlSerializable la interfaz y, a continuación, chuck un lector/escritor, pero me gustaría evitar que desde luego significa que necesito para crear una instancia de un lector/escritor cada vez que quiero hacerlo, y el 99,99% del tiempo voy a estar trabajando con un cadena así que creo que podría escribir mi propio.

Sin embargo, para serializar a XML, soy simplemente decorar la clase y sus miembros, con el Xml??? atributos ( XmlRoot , XmlElement etc.) y, a continuación, pasar a la XmlSerializer y un StringWriter para obtener la cadena.Lo que está bien.Tengo la intención de poner el método para devolver la cadena en un genérico método de utilidad, así que no necesita preocuparse de tipo etc.

El este, que me preocupa es esto:Si no me decorar la clase(s) con los atributos necesarios de un error no es lanzada hasta el tiempo de ejecución.

Hay alguna forma de hacer cumplir atributo de la decoración?Se puede hacer esto con FxCop? (No los he usado FxCop aún)

ACTUALIZACIÓN:

Lo siento por el retraso en la obtención de este cierre chicos, muchas cosas que hacer!

Definitivamente como la idea de utilizar la reflexión para hacer en un caso de prueba, en lugar de recurrir a FxCop (como para mantener todo junto).. Fredrik Kalseth la respuesta fue fantástico, gracias por incluir el código que probablemente me han llevado un poco de cavar para averiguar cómo hacerlo yo mismo!

+1 a los otros chicos para sugerencias similares :)

¿Fue útil?

Solución

Me gustaría escribir un/unidad de integración de la prueba que verifica que cualquier clase de coincidencia de algunos de los criterios dados (es decir, la creación de subclases X) está decorado de forma adecuada.Si configura su construcción a ejecutar con pruebas, usted puede tener la acumulación de error cuando esta prueba falla.

ACTUALIZACIÓN:Usted dijo, "Parece que tendré que rodar mis mangas y asegúrese de que la unidad de pruebas, colectivamente, se mantiene" - usted no tiene que.Acaba de escribir un general de la clase de prueba que utiliza la reflexión para encontrar todas las clases que necesita ser afirmado.Algo como esto:

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

Otros consejos

Se puede escribir de la unidad de pruebas para comprobar este tipo de cosas - que básicamente se utiliza la reflexión.

Dado el hecho de que esto es posible, supongo que también sería posible escribir un FxCop regla, pero nunca he hecho tal cosa.

Usted puede escribir un FxCop regla o incluso comprobar los atributos llamando GetType() en la base del constructor de la clase y reflexionar sobre el tipo devuelto.

Una buena FXCop regla (y una de las que me estoy encontrando necesito ahora) sería comprobar que todos los objetos que se añaden a la ASP.NET la Sesión tiene el atributo Serializable.Estoy tratando de pasar de InProc estado de sesión de SQL Server.Primera vez que solicita una página de mi sitio explotó en mí porque no objetos serializables estaban siendo almacenados en la Sesión.Luego vino la tarea de la caza a través de todo el código fuente en busca de cada una de las instancias en las que un objeto se establece en la Sesión...FXCop sería una buena solución.Algo para trabajar en...

También puede utilizar este concepto/post-procesador para aplicar relaciones entre atributos y similar a la de inicio de sesión para aplicar relaciones entre las clases y los atributos en tiempo de compilación:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top