¿Ha evolucionado en C#el diseño de interfaces marcadores como la serializable o clonable de Java?
-
26-10-2019 - |
Pregunta
Java proporciona java.io.Serializable
y java.lang.Cloneable
En su biblioteca estándar (y apoyo especial para la TI en el idioma y el JVM) para tareas en torno a la deserialización/serialización/clonación.
Ha elegido C# una ruta diferente para proporcionar esta funcionalidad, ¿cómo difiere la implementación y el código de código de Java y por qué se hizo de esta manera?
Como ejemplo, ¿por qué C# usa un atributo (anotación) y una interfaz para la serialización?
Solución
.Net no se usa ISerializable
como solo una interfaz marcador. Actúa no solo como un marcador, sino que también le permite controlar exactamente cómo .NET serializará la clase implementando GetObjectData
y un constructor que toma los argumentos adecuados.
El atributo se usa cuando la clase se puede serializar, pero no desea definir su propio comportamiento de serialización.
Entonces: usa ISerializable
Cuando quieres definir tu propio comportamiento de serialización; o usar el [Serializable]
Atributo cuando desee dejarlo a la formación de serialización.
¿Lo llamaría evolución? No sé. .NET solo le ofrece diferentes grados de flexibilidad.
Otros consejos
Si quieres algo sobre la serialización: Mira esto
No creo que C# haya evolucionado. Más bien, arreglaron ambas cosas:
La serialización en Java no es muy limpia: la deserialización implica la "creación" de los objetos sin llamar a un constructor, todo el proceso puede incluir el tiempo de ejecución que llama a los métodos privados, etc. Verifique las especificaciones Si tienes curiosidad.
Cloneable
está simplemente roto. No debe ser una interfaz marcadora, pero especifique elclone()
método. Como eres tu tienesCloneable
s no puedesclone()
.
Básicamente, hay muchas cosas en Java, principalmente de los anteriores a 1.2 días, que están bastante rotos/desordenados/inmundos/lo que sea.
No estoy seguro de lo que quiere decir con 'evolucionado', si algo, creo que la tendencia es hacia los atributos en lugar de las interfaces marcadoras. No sé si Java también ha ido así.
La serialización en el CLR, por ejemplo, se evidencia en su forma más básica con los atributos, aunque puede implementar algunas interfaces no marcadoras que le brindan más control sobre el proceso si lo necesita.
Las interfaces de marcadores son probablemente una de las peores decisiones jamás implementadas en Java. Quiero decir, mira lo inútil que resultó ser, porque nadie definió un método público clon () en la interfaz.
.Net no entrar en esa dirección (al menos no soy consciente de ninguna interfaces en esa dirección) es menos evolución y más un abandono de toda la noción. Otra dirección que parece tomarse cada vez más parece ser anotaciones, lo que supongo que se podría ver como un "marcador", pero en un nivel más básico (por ejemplo, estoy bastante seguro de si Java se implementó hoy, transitoria sería una anotación y no un calificador)