Aunque me doy cuenta de que hay una pregunta similar (How to serialize an Exception object in C#?), y aunque las respuestas en esa página fueron útiles, no resolvieron el problema ni respondieron exactamente la pregunta planteada.Serialización Excepción para ser arrojable
Creo que la pregunta era cómo serializar el objeto para permitir que se reconstruya (deserialice) en el mismo objeto. Intenté utilizar la solución proporcionada por davogones y Antony Booth, pero sin agregar la clase base System.Exception
en el lado consumidor (como en: SerializationException: Exception
), es imposible usar estos tipos (por sí mismos) como objetos de excepción reales que pueden ser arrojado.
Antes de continuar, permítanme explicar esa última afirmación. Intenté usar Antony Booth's solution en un servicio web (el servicio contiene la definición del objeto serializable) para que todos los consumidores utilicen la misma excepción (con la esperanza de crear un tipo de excepción serializable reutilizable en lugar de volver a crearlo).
Lamentablemente, dado que ninguno de los tipos se deriva explícitamente de System.Exception
, no puede throw
, lo que obviamente sería útil. Como mencioné anteriormente, parece que agregar : Exception
a la definición de clase de tipo en el lado consumidor permite lanzar el objeto, pero eso requiere editar el código WSDL/servicio web generado automáticamente, que parece intuitivamente como un mal/no sostenible practica conmigo (corrígeme si estoy equivocado).
Mi primera pregunta es, de nuevo, ¿es posible serializar System.Exception
o crear un tipo derivado que se pueda serializar y, si es posible, cómo se podría hacer? Debo mencionar que he visto lo que parece ser la forma oficial de reconstitute the Exception
object, pero me temo que no lo entiendo muy bien.
Mi segunda pregunta es sobre la arquitectura de System.Exception
sí mismo. Lo que me gustaría saber es por qué el tipo System.Exception
está marcado como [Serializable]
cuando ha sido documentado y aparentemente diseñado para no permitirle serializarlo correctamente (al menos con XML) porque el objeto Data
implementa IDictionary
?
De MSDN:
Q: ¿Por qué no puedo serializar tablas hash?
A: El XmlSerializer no puede procesar las clases que implementan la interfaz IDictionary. Esto se debió en parte a restricciones de programación y en parte debido al hecho de que una tabla hash no tiene una contraparte en el sistema de tipo XSD. La única solución es implementar una tabla hash personalizada que no implemente la interfaz IDictionary.
Dado que XML se está convirtiendo (si no está ya) un nuevo estándar para el transporte de datos (recomendado oficialmente por Microsoft, no obstante), parece absurdo estúpido para no permitir que el único tipo de objeto en .NET que puede ser lanzado para no ser XML-serializable.
Espero escuchar algunos pensamientos de todos los SO'rs (sobre todo porque esta es mi primera publicación).
Si tiene preguntas o necesita aclaraciones, no dude en hacérmelo saber.
Nota: Me acaba de encontrar this SO post, que parece responder a algunas preguntas, pero supongo que me gustaría tener mi propio golpe en ella. pero dígame si está demasiado cerca de un duplicado.
Solo una nota rápida que 'ApplicationException' ha quedado en desuso y _no debe_ usarse ni subclasificarse. Use 'Exception' en su lugar. – thecoop
Desafortunadamente, esto no parece funcionar en el contexto de los servicios web. Copié tu código y cambié 'ApplicationException' a' Exception', y obtuve el mismo código de error al que me refería antes: No se puede serializar el miembro System.Exception.Data de tipo System.Collections.IDictionary, porque implementa IDictionary. Simplemente agregando '[Serializable]' no es suficiente. – llaughlin
Hrm. ¿Tal vez puede cambiar el miembro _data a una colección serializable que no implementa IDictionary? Hay algunas implementaciones que hacen esto. –