¿Por qué las interfaces no son ?

Creo que agregar ese atributo a una interfaz sería útil, asegúrese de no crear clases que usen la interfaz y olvidar hacerlas serializables.

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

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

La serialización se trata de guardar y cargar el 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 que sea Serializable , esta es la razón por la ISerializable existe la interfaz ISerializable .

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

 interface MustBeSerializable : ISerializable {} 

Vea más información aquí .

Si desea forzar que las clases que implementan su interfaz personalizada IMyInterface puedan serializar, puede definir que tenga:

 interface IMyInterface : ISerializable { // Custom interface definition } 

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

IIRC, también puede crear una regla personalizada de FxCop que verifique que las clases IMyInterface de IMyInterface estén marcadas con el atributo respectivo [Serializable] y de esta manera eliminen la necesidad de que las clases implementen la serialización personalizada.

Hay algunas buenas razones esotéricas detrás de lo que es una interfaz y 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 vienen a la mente.

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

Bueno, hay una razón por la que las nuevas clases no están marcadas como serializables de manera predeterminada: Al agregar el atributo Serializable , usted reconoce que se ha asegurado de que la serialización en su clase funciona , seleccionando los tipos de datos adecuados para sus campos de instancia y agregando lógica de serialización , si 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).