Сериализуемые объекты против не сериализуемых объектов - PullRequest
4 голосов
/ 10 сентября 2010

Чем отличаются сериализуемые объекты от несериализуемых объектов, и что делает объект сериализуемым? И какое отношение сериализуемые объекты имеют к XML?

Спасибо

Ответы [ 4 ]

5 голосов
/ 10 сентября 2010

в чем отличие Сериализуемые объекты от несериализуемых объектов

Сериализуемый объект может быть преобразован в некоторое другое представление, например текст, чтобы его можно было легко передавать через границы процесса, тогда как несериализуемый объект не может.

А что делает объект сериализуемым

В .NET, в зависимости от того, какой сериализатор вы решили использовать, объект должен соответствовать определенным требованиям. Например, если вы используете BinaryFormatter , ваш объект должен быть украшен атрибутом [Serializable].

И какое отношение сериализуемые объекты имеют к XML

Объект может быть сериализован в XML. В .NET это может быть достигнуто, например, с помощью класса XmlSerializer , а также с помощью DataContractSerializer .

3 голосов
/ 10 сентября 2010

Проблема почти никогда не заключается в том, можно ли сериализовать объект или нет. Реальная проблема часто заключается в том, можете ли вы восстановить пригодную для использования и дословную копию объекта, когда вы десериализуете it.

Хорошим примером является элемент управления Windows Forms. Элемент управления не может существовать без родителя, скажем, в форме, в которой он размещен. Десериализация элемента управления оставляет элемент управления без родителя, вы должны сериализовать весь граф объекта, чтобы сделать его осмысленным. Кроме того, существуют свойства, которые имеют значение времени выполнения, которое не будет воспроизводиться при десериализации. Свойство Handle, например. Windows не будет воспроизводить ту же ручку. Или, подчеркнут ли индикатор клавиши быстрого вызова (нажмите клавишу Alt). Это критически зависит от всего состояния программы. Соответственно, Control не имеет атрибута [Serializable].

2 голосов
/ 10 сентября 2010

Ответы здесь верны, но атакуйте концепцию под другим углом и, надеюсь, улучшите ваше понимание, я предлагаю следующее:

Подумайте, что слово «сериализуемый» означает «конвертируемый». Поэтому, когда класс помечается как сериализуемый, он конвертируется в любой тип представления, который вы ищете. Сериализатор (т.е. BinaryFormatter или XmlSerializer) можно рассматривать как «конвертер».

С этим, так сказать, вы бы использовали конвертер ( сериализатор ) в конвертирующий что-то, что конвертируемое ( сериализуемые ). Сам класс не изменяется, но он добавляет функциональность классу.

Примеры того, почему:

  • Обычно используется для преобразования объекта в двоичное представление (сериализация с использованием двоичного форматера), если вы хотите легко записать его на диск или отправить в другое приложение через сокет.
  • Другое распространенное использование - преобразование объекта в представление XML (как видно из ответа RandomNoob), если вы хотите отправить его в веб-службу.

Есть некоторые предостережения, которые следует учитывать при сериализации (например, вы, как правило, не хотите сериализовать события в .NET и помечаете их атрибутом [field: non-serialized]), поэтому необходимо провести дополнительные исследования. в этом отношении, но концептуально, попытайтесь представить его как преобразование объекта для хранения или передачи.

1 голос
/ 10 сентября 2010

Сериализуемые объекты могут быть «разделены», переданы по разным каналам и «реконструированы» в конце приемного канала, который может быть совершенно другим местом в том же состоянии, в котором он был «разделен». Возможно, вы слышали о xml, упомянутом в ходе разговора о сериализации, потому что xml предоставляет механизм для этого.

Рассмотрим следующий объект:

Person p = new Person();
p.Age = 33;
p.Name = "Magni";

Если вы хотите сохранить этот объект в его текущем состоянии - вы можете эффективно представить это как:

<Person>
    <Name>Magni</Name>
    <Age>33</Age>
</Person>

Этот XML затем может быть отправлен по сети, и исходный объект Person может быть восстановлен или использован другим объектом или службой в случае использования других платформ.

Это вид 30000 футов, сериализация часто усложняется, но я попытался ответить на ваш вопрос в самом широком смысле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...