protected, что позволит использовать этот конструктор потомками класса, осуществляющими собственную сериализацию. У конструктора те же аргументы, что и у метода GetObjectData. Опять-таки, в основном используется аргумент info и его метод GetValue(key, type), который выполняет операцию, обратную к операции метода AddValue. По ключу key находится хранимое значение, а аргумент type позволяет привести его к нужному типу. У метода GetValue имеется множество типизированных версий, позволяющих не задавать тип. Так что восстановление полей name и age можно выполнить следующими операторами: name = info.GetString("name"); age = info.GetInt32("age"); Восстановление поля son, являющегося ссылочным типом, выполняется вызовом его специального конструктора: son = new Child(info, context); А теперь вернемся к нашему примеру со стариком, старухой и золотой рыбкой. Заменим стандартную сериализацию собственной. Для этого, оставив атрибут сериализации у класса Personage, сделаем класс наследником интерфейса ISerializable: [Serializable] public class Personage :ISerializable {...} Добавим в наш класс специальный метод, вызываемый при сериализации - метод сохранения данных: //Специальный метод сериализации public void GetObjectData(SerializationInfo info, StreamingContext context) { |