¿Es necesario implementar la interfaz ISerializable cuando no se implementa ninguna serialización / deserialización personalizada?

Estoy mirando una clase en una solución que implementa la interfaz ISerializable . Tiene un método GetObjectData para la serialización como lo requiere la interfaz. No se está produciendo ninguna serialización personalizada aquí, simplemente está SerializationInfo objeto SerializationInfo con los nombres de las propiedades de la clase y sus valores.

 [Serializable] public class PersonName :ISerializable { [DataMember] public string NamePrefix { get; set; } [DataMember] public string GivenName { get; set; } [DataMember] public string SurName { get; set; } public PersonName(string givenName, string surName, string namePrefix) { GivenName = givenName; SurName = surName; NamePrefix = namePrefix; } public PersonName() { } #region ISerializable Members public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("NamePrefix",NamePrefix); info.AddValue("GivenName",GivenName); info.AddValue("SurName",SurName); } } 

De la documentación que he leído hasta ahora, según tengo entendido, esto es lo que ocurriría de todas formas si la clase estuviera marcada con el atributo [Serializable] , y como puede ver, la clase no tiene un constructor de deserialización, por eso Lo estoy viendo para empezar. Por lo que puedo decir, en lugar de tener que agregar el constructor de deserialización a la clase, la clase realmente no necesita implementar la interfaz ISerializable en primer lugar. ¿Es eso correcto?

Es bastante inútil.

Podría justificarse si alguna vez hubiera implementado ISerializable por una mejor razón, y los cambios en la implementación significaron que ya no era tan útil. Podría ser un cambio rotundo dejar de implementarlo.

Si lo hubieran implementado con una implementación explícita ( void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) lugar de public void GetObjectData(SerializationInfo info, StreamingContext context) y tuvieran el constructor que tomó SerializationInfo y StreamingContext privado, entonces sería un cambio menos perjudicial, aún técnicamente un cambio importante, pero es mucho menos probable que rompa cualquier uso real. Esto en sí mismo es una razón para tener ese constructor privado.

Sin embargo, debe estar al menos protected si la clase no está sellada, y las clases derivadas deben usarla para que también puedan ser serializadas. En este caso, será totalmente un cambio importante dejar de usarlo, ya que todas las clases derivadas se romperían.

De la misma manera, se estaría rompiendo el cambio si no lo implementaras, y luego comenzaras a hacerlo, y obtuvieras clases derivadas de él. Esto podría ser una justificación para evitar la posibilidad, aunque, para ser honesto, lo considero un fracaso importante del principio YAGNI, a menos que haya una muy buena razón para sospechar que sería útil. (En general, si fuera a agregar algo que lo hiciera necesario, podría ajustar las características requeridas en otra clase, implementarlo y tener un miembro de ese tipo, por lo que la clase existente aún puede ser serializada sin él).

Edit: el ” must ” de arriba es el “must” de “debes hacer esto o hay malas implicaciones” en lugar de “must” de “debes hacerlo o no se comstackrá”. Por supuesto, los primeros son peores que los últimos porque a veces no puedes hacerlo.

la clase realmente no necesita implementar la interfaz ISerializable en primer lugar. ¿Es eso correcto?

Correcto. Implementar ISerializable es cuando necesita hacer algo distinto al comportamiento de serialización predeterminado. El atributo [Serializable] debería ser suficiente.

Usted también puede implementar ISerializable. Sí, puede ser mucho escribir si tienes muchos objetos, pero el deserializador se romperá si más adelante lo introduces. Creo que es mejor para versionar objetos en lugar de escribir objetos nuevos y mantener objetos antiguos.

Implementar Iserializable proporciona una mejora en el rendimiento porque no hay necesidad de usar la reflexión para serializar el objeto

Se requiere un constructor de firmas (información de SerializationInfo, contexto StreamingContext). Por tiempo de deserialización.

Veo, la implementación de ISerializable no es necesaria para esta clase. O debe agregar un constructor con la firma (información de SerializationInfo, contexto StreamingContext): protected PersonName (SerializationInfo info, StreamingContext context){ this.NamePrefix = info.GetString("NamePrefix"); this.SurName = info.GetString("SurName"); this.GivenName = info.GetString("GivenName"); } protected PersonName (SerializationInfo info, StreamingContext context){ this.NamePrefix = info.GetString("NamePrefix"); this.SurName = info.GetString("SurName"); this.GivenName = info.GetString("GivenName"); }