Когда вы используете атрибут SerializableAttribute
, вы помещаете атрибут в поле во время компиляции таким образом, чтобы во время выполнения средства сериализации знали, что сериализовать на основе атрибуты, выполняя рефлексию для класса / модуля / типа сборки.
[Serializable]
public class MyFoo { … }
Выше указано, что средство сериализации должно сериализовать весь класс MyFoo
, тогда как:
public class MyFoo
{
private int bar;
[Serializable]
public int WhatBar
{
get { return this.bar; }
}
}
Используя атрибут, вы можете выборочно выбирать поля, которые необходимо сериализовать.
При реализации интерфейса ISerializable
сериализация фактически переопределяется с помощью пользовательской версии путем переопределения GetObjectData
и SetObjectData
( и предоставляя конструктор вида MyFoo(SerializationInfo info, StreamingContext context)
), будет более точный контроль над сериализацией данных.
См. Также этот пример пользовательской сериализации здесь, в StackOverflow . В нем показано, как обеспечить обратную совместимость сериализации с различными версиями сериализованных данных.
Надеюсь, это поможет.