tipos serializar serialización serializacion que deserializacion como clase c# .net serialization

c# - serializar - serialversionuid que es



¿Por qué se requiere un atributo serializable para que un objeto se serialice? (2)

Esto es solo un requisito para BinaryFormatter (y el equivalente de SOAP, pero nadie lo usa). Diego tiene razón; hay buenas razones para esto en términos de lo que hace, pero está lejos de ser la única opción; de hecho, personalmente solo recomiendo BinaryFormatter para hablar entre AppDomains ; no es (IMO) una buena forma de conservar datos (en el disco, en caché, a una base de datos BLOB, etc.).

Si este comportamiento le causa problemas, considere usar cualquiera de las alternativas:

  • XmlSerializer , que funciona en miembros públicos (no solo en los campos), pero exige un constructor público sin parámetros y un tipo público
  • DataContractSerializer , que puede funcionar por completo (usando [DataContract] / [DataMember] ), pero que también (en 3.5 y superior) puede funcionar contra los campos en su lugar

Además, para una opción de terceros (yo soy el tercero); protobuf-net puede tener opciones aquí; "v2" (aún no se ha lanzado por completo, pero está disponible como fuente) permite que el modelo (qué miembros serializar, etc.) se describa independientemente del tipo, para que se pueda aplicar a los tipos que no controla. Y a diferencia de BinaryFormatter, el resultado es tolerante a la versión, formato público conocido, etc.

Según lo que entiendo, SerializableAttribute no proporciona comprobaciones de tiempo de compilación, ya que todo se hace en tiempo de ejecución. Si ese es el caso, ¿por qué es necesario que las clases se marquen como serializables?

¿No podría el serializador simplemente tratar de serializar un objeto y luego fallar? ¿No es eso lo que hace ahora? Cuando algo está marcado, lo intenta y falla. ¿No sería mejor si tuvieras que marcar las cosas como no serializables en lugar de serializables? De esa forma, ¿no tendrías el problema de que las bibliotecas no marcan las cosas como serializables?


Según tengo entendido, la idea detrás de SerializableAttribute es crear un sistema opt-in para la serialización binaria.

Tenga en cuenta que, a diferencia de la serialización XML, que utiliza propiedades públicas, la serialización binaria captura todos los campos privados de manera predeterminada.

No solo esto podría incluir estructuras de sistema operativo y datos privados que no deberían estar expuestos, sino que deserializarlos podría provocar un estado corrupto que puede bloquear una aplicación (ejemplo tonto: un identificador para un archivo abierto en una computadora diferente).