Estoy buscando una manera fácil de verificar si un objeto en C # es serializable.
Como sabemos, usted crea un objeto serializable implementando la interfaz ISerializable o colocando [Serializable] en la parte superior de la clase.
Lo que estoy buscando es una forma rápida de verificar esto sin tener que reflejar la clase para obtener sus atributos. La interfaz sería rápida usando una declaración is .
Usando la sugerencia de @ Flard, este es el código que se me ocurrió, grito si hay una manera mejor.
private static bool IsSerializable(T obj)
{
return ((obj is ISerializable) || (Attribute.IsDefined(typeof (T), typeof (SerializableAttribute))));
}
O incluso mejor, simplemente obtenga el tipo de objeto y luego use la propiedad IsSerializable en el tipo:
typeof(T).IsSerializable
Sin embargo, recuerde que esto parece ser solo la clase con la que estamos tratando si la clase contiene otras clases, probablemente desee verificarlas todas o intente serializar y esperar errores como señaló @pb.
fuente
Respuestas:
Tienes una hermosa propiedad en la
Type
clase llamadaIsSerializable
.fuente
Tendrá que verificar todos los tipos en el gráfico de objetos que se serializan para el atributo serializable. La forma más sencilla es intentar serializar el objeto y detectar la excepción. (Pero esa no es la solución más limpia). Type.IsSerializable y la comprobación del atributo serializalbe no tienen en cuenta el gráfico.
Muestra
fuente
Esta es una pregunta antigua, que puede necesitar ser actualizada para .NET 3.5+. Type.IsSerializable puede devolver falso si la clase usa el atributo DataContract. Aquí hay un fragmento que uso, si huele mal, avíseme :)
fuente
null
verificación y devolver sitrue
?Use Type.IsSerializable como otros han señalado.
Probablemente no valga la pena intentar reflexionar y verificar si todos los miembros del gráfico de objetos son serializables.
Un miembro podría declararse como un tipo serializable, pero de hecho puede instanciarse como un tipo derivado que no es serializable, como en el siguiente ejemplo artificial:
Por lo tanto, incluso si determina que una instancia específica de su tipo es serializable, en general no puede estar seguro de que esto sea cierto para todas las instancias.
fuente
Probablemente implique la reflexión bajo el agua, pero ¿la forma más sencilla?
fuente
Aquí hay una variación 3.5 que la pone a disposición de todas las clases mediante un método de extensión.
fuente
Tomé la respuesta a esta pregunta y la respuesta aquí y la modifiqué para que obtenga una Lista de tipos que no se pueden serializar. De esa manera, puede saber fácilmente cuáles marcar.
Y luego lo llamas ...
Cuando se ejecute, nonSerializableTypes tendrá la lista. Puede haber una mejor manera de hacer esto que pasar una Lista vacía al método recursivo. Alguien me corrija si es así.
fuente
El objeto de excepción puede ser serializable, pero usando otra excepción que no lo es. Esto es lo que acabo de tener con WCF System.ServiceModel.FaultException: ¡FaultException es serializable pero ExceptionDetail no!
Entonces estoy usando lo siguiente:
fuente
Mi solución, en VB.NET:
Para Objetos:
Para tipos:
fuente