L'interfaccia ISerializable presenta un'asimmetria su cui secondo me varrebbe la pena di riflettere in modo più profondo:
il suo metodo GetObjectData offre al formattatore un container (SerializationInfo) con tutti i dati necessari per la serializzazione e un altro (StreamingContext) con tutti i, chiamiamoli, metadati. Al contrario, per la deserializzazione, non si trova un simmetrico SetObjectData (come qualcuno si potrebbe aspettare insieme a Christoph Schittko) ma un costruttore protected per la classe che implementa l'interfaccia, costruttore che deve avere gli stessi parametri con il metodo GetObjectData - l'esistenza di questo però non la costringe nessuno... Un processo così simmetrico come quello della serializzazione/deserializzazione, ha preso un'implementazione così asimmetrica.
Ma non così stanno le cose per l'ISerializationSurrogate, dove troviamo il metodo SetObjectData! E' vero che qua sarebbe stato impossibile scrivere il costruttore per la deserializzazione :-) ma perché secondo voi i progettisti del framework non hanno adottato una soluzione simile anche per ISerializable?
Avete mai incontrato un disegno simile?