Просто подумал, что я бы немного больше на этот ответ. [Сериализуемый] против ISerializable был чем-то, что смутило меня некоторое время, и я наконец-то исправил это.
Если вы хотите, чтобы класс был сериализуемым, вы применяете атрибут [Serializable]. Это все, что вам нужно (и это правда сегодня). Однако бывают случаи, когда вам требуется более точное управление процессом сериализации (возможно, у получателя сериализованного объекта есть некоторые строгие требования, которые ваш объект меньше заботит). Чтобы справиться с любой настройкой того, как объект сериализуется в течение до .NET 2.0 дней, вы добавили интерфейс ISerializable в дополнение к применению атрибута [Serializable].
Интерфейс ISerializable имеет одно требование к функции:
void GetObjectData(SerializationInfo info,StreamingContext context)
В этой функции вы сериализовали свой контент:
GetObjectData(SerializationInfo info,StreamingContext context)
{
// example of some type of customization of the serialization process, giving
// your serialized class member a custom name
info.AddValue("GiveMyDataMemberCustomNameInOutput", myDataMember);
...
С появлением (.NET 2.0) некоторых дополнительных атрибутов [Serializable] вам не нужно реализовывать ISerializable.GetObjectData (), чтобы настроить как что-то было сериализовано.
Так как вы справляетесь с фанки-сериализацией по-новому? Ну, у [Serializable] есть несколько партнеров, в частности, [OnSerializing] и [OnDeserialized]. Если вам нужно выполнить классную сериализацию / десериализацию, которую вы использовали для ISerializable.GetObjectData (), вы теперь обрабатываете ее в событиях.
Две вещи, на которые я хочу обратить внимание:
- Нет особой причины (IMO, но могут быть крайние случаи) использовать / реализовать интерфейс ISerializable. Просто используйте новые атрибуты [Serializable]
- Если вы считаете, что вам нужен ISerializable, помните, что вы также должны применить атрибут [Serializable] к своему классу.