2010-04-14 29 views
27

Creo que agregar ese atributo a una interfaz sería útil, asegúrese de no crear clases que usen la interfaz y olvide hacerlas serializables.¿Por qué las interfaces no son [Serializable]?

Esta podría ser una pregunta fundamental, pero quería preguntar a los expertos.

+0

Yous debería verificar esta respuesta si quiere saber cómo http: // stackoverflow.com/questions/1333864/xml-serialization-of-interface-property – juharr

Respuesta

65

Las interfaces definen un contrato y no tienen ningún estado propio.

Serialización se trata de guardar y cargar estado dentro y fuera de un modelo de objetos.

No tiene mucho sentido serializar algo que no tiene ningún estado.


Para responder a la pregunta práctica de forzar una implementación de una interfaz para ser Serializable - es por eso que existe la interfaz ISerializable.

En .NET se puede declarar una interfaz que se deben implementar otras interfaces:

interface MustBeSerializable : ISerializable {} 

ver algunos más información here.

+0

Explicación impresionante :-) – Raja

+0

Gran explicación. –

+6

Defensor del diablo: las interfaces implican * cómo * los objetos funcionan con su estado. Las interfaces no tienen estado, pero se usarán para definir los objetos que hacen y contrae la forma en que se puede acceder al estado. – Dinah

4

Si desea forzar clases que implementan la interfaz personalizada IMyInterface ser serializable puede definir que tiene:

interface IMyInterface : ISerializable 
{ 
    // Custom interface definition 
} 

Esto indica más claramente que la clase de implementación debe soportar la serialización. Esto no elimina la necesidad de marcar la clase con el atributo [Serializable].

IIRC, también puede crear una regla personalizada FxCop que comprueba que las clases que heredan de IMyInterface están marcados con el respectivo [Serializable] atributo y de esta manera eliminar la necesidad de implementar clases de serialización personalizado.

2

Hay algunas razones buenas, aunque esotéricas, detrás de lo que es una interfaz y que no es lo que impide que esto sea posible. Sin embargo, dijo eso: estoy de acuerdo contigo. Hay muchas cosas que serían útiles si pudiéramos incorporarlas a las interfaces. [Serializable] y la estática me vienen a la mente.

Aunque no se ajustan a la filosofía de lo que es una interfaz, parecen incorporar esta zona gris vacante en una sola herencia OOP. Por supuesto, hay alternativas, pero se sienten muy forzados en comparación con el intento original.

2

Bueno, hay una razón por la que las nuevas clases no están marcados como serializable por defecto: Al añadir el atributo Serializable, usted reconoce que ha asegurado que la serialización en su clase funciona, por la elección de los tipos de datos adecuados para la instancia campos y agregando lógica de serialización, si es necesario.

Por lo tanto, si "olvidó" agregar el atributo Serializable a su clase, probablemente también se olvidó de verificar si la serialización realmente funciona en su clase. De acuerdo, en muchos casos funcionará "de fábrica", por lo que agregar el atributo es todo lo que queda, pero se supone que debes verificarlo y reconocerlo explícitamente (al agregar manualmente el atributo).

Cuestiones relacionadas