SerializableAtttribute против ISerializable - PullRequest
1 голос
/ 11 февраля 2011

У меня есть метод расширения

 public static T DeepClone<T>(this T source) where T : ISerializable
 {
  ..
 }

Когда я добавил «где T: ISerializable», я получаю сообщение об ошибке во всех классах, использующих DeepClone () с атрибутом [Serializable].

  • В чем проблема?

РЕДАКТИРОВАТЬ:

  • Я знаю, что мои классы должны реализовать ISerializable для работы.Но есть ли разница в сериализованном выводе при использовании ISerializable против [Serializable]?

Ответы [ 4 ]

3 голосов
/ 11 февраля 2011

Существует два способа сделать сериализуемый тип.

  • Реализация ISerializable (Меньше используется)
  • Применить атрибут [Сериализуемый] (больше используется и проще)

В вашем случае вы рассматриваете только первый.

Чтобы решить эту проблему, просто позвольте сериализатору обрабатывать сообщения об ошибках. Это выдаст ошибку для любого объекта, который не сериализуем.

2 голосов
/ 15 апреля 2014

Просто подумал, что я бы немного больше на этот ответ. [Сериализуемый] против 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 (), вы теперь обрабатываете ее в событиях.

Две вещи, на которые я хочу обратить внимание:

  1. Нет особой причины (IMO, но могут быть крайние случаи) использовать / реализовать интерфейс ISerializable. Просто используйте новые атрибуты [Serializable]
  2. Если вы считаете, что вам нужен ISerializable, помните, что вы также должны применить атрибут [Serializable] к своему классу.
2 голосов
/ 11 февраля 2011

Проблема в том, что присвоение атрибута (Serializable) не имеет ничего общего с реализацией интерфейса (ISerializable).

1 голос
/ 11 февраля 2011

Вы должны добавить интерфейс ISerializable для ваших классов

public class YourClass : ISerializable
...