Cualquier clase que tenga posibilidades de serializarse debe marcarse con SerializableAttribute. Si una clase necesita controlar su proceso de serialización, puede implementar la interfaz ISerializable. Formatter llama al método GetObjectData en el momento de la serialización y llena el objeto SerializationInfo suministrado con todos los datos necesarios para representar el objeto. Formatter crea un objeto SerializationInfo con el tipo del objeto del gráfico. Los objetos que necesitan enviar proxies para ellos mismos pueden utilizar FullTypeName y AssemblyName en el objeto SerializationInfo para cambiar la información transmitida.
En el caso de herencia de clases, se puede serializar una clase derivada de una clase base que implementa ISerializable. En este caso, la clase derivada debe llamar a la implementación de la clase base de GetObjectData en su implementación de GetObjectData. De lo contrario, no se serializarán los datos de la clase base.
La interfaz ISerializable implica un constructor con la firma constructor (información SerializationInfo, contexto StreamingContext). En el momento de la deserialización, se llama al constructor actual sólo después de que el formateador haya deserializado los datos de SerializationInfo. En general, este constructor debe protegerse si la clase no es de tipo sealed.
No se puede garantizar el orden en el que se deserializan los objetos. Por ejemplo, si un tipo hace referencia a otro que no se ha deserializado todavía, se producirá una excepción. Si crea tipos que tienen tales dependencias, puede solucionar el problema implementando la interfaz IDeserializationCallback y el método OnDeserialization.
La arquitectura de serialización controla tipos de objetos que extienden MarshalByRefObject al igual que tipos que extienden Object. Estos tipos se pueden marcar con SerializableAttribute e implementan la interfaz ISerializable como cualquier otro tipo de objeto. Su estado de objeto se capturará y persistirá en la secuencia.
Cuando estos tipos se utilizan a través de System.Runtime.Remoting, la infraestructura de entorno remoto proporciona un suplente que anticipa la serialización típica y, en su lugar, serializa un proxy para MarshalByRefObject. Un suplente es un elemento auxiliar que sabe cómo serializar y deserializar objetos de un tipo concreto. El proxy, invisible para el usuario en la mayoría de los casos, será de tipo ObjRef.
Como modelo de diseño general, sería poco habitual que una clase se marcase con el atributo "serializable" y extendiese MarshalByRefObject. Los programadores deben detenerse a pensar sobre los posibles escenarios de serialización y entorno remoto al combinar estas dos características. Un caso en el que esto sería aplicable se da con MemoryStream. Mientras que la clase base de MemoryStream (Stream) se extiende desde MarshalByRefObject, es posible capturar el estado de un objeto MemoryStream y restaurarlo como se desee. Por tanto, podría tener sentido serializar el estado de esta secuencia en una base de datos y restaurarla más adelante. No obstante, si se utiliza un objeto de este tipo a través de un entorno remoto, se utilizaría un proxy.
Para obtener más información sobre la serialización de clases que extienden MarshalByRefObject, vea RemotingSurrogateSelector. Para obtener más información sobre la implementación de ISerializable, vea Serialización personalizada.
Notas para los implementadores
Implemente esta interfaz para permitir que un objeto participe en su propia serialización y deserialización.