2009-09-01 4 views
7

Что такое сериализация объектов и десериализация? Какая разница в Сериализации с обычными методами, такими как чтение свойств объекта, а затем заполнение их столбцами DataRow и, наконец, сохранение DataRow в БД?Сериализация и десериализация объектов?

Спасибо

+0

Большое спасибо за все ваши ответы, я поставил другой вопрос здесь в качестве комментария: Чтение ваших ответов, поэтому, когда это полезно, используя сериализацию в приложении, использующем БД? – odiseh

ответ

1

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

Фактически, сохранение свойств объекта в таблице является формой сериализации.

В .NET есть и другие формы:

  • XmlSerialization
  • BinarySerialization

Вы можете сделать свой собственный.

Но в общем случае, если вы где-то сохраняете состояние своего объекта, а затем снова читаете его в «живом» объекте во время выполнения, вы его сериализуете.

+2

Сериализация не обязательно означает запись на диск. Это просто означает, что он помещается в некоторый двоичный формат, который можно экспортировать. Например, сериализованный объект может быть отправлен по сети, а не на диск. – Chuck

+0

Да, вот почему внизу я написал «где-то». Я просто пропустил «в общем», в первом предложении. Вы правы, конечно. –

14

Сериализация обычно относится к созданию версии данных (а не объектов), которые могут использоваться для хранения (возможно, в файле), для передачи по сети или, возможно, только для передачи между процессами/AppDomain s/и т. д. на одной машине.

Сериализация обычно означает запись данных в виде строки (think: xml/json) или как необработанный двоичный файл (byte[] и т. Д.). Дезициализация - обратный процесс; взятие необработанных данных (из файла, из входящего сетевого сокета и т. д.) и восстановление объектной модели.

Разница между использованием db заключается в том, что он не имеет встроенной табличной компоновки и не имеет реальной привязки к базе данных; данные могут быть любой формы и имеют тенденцию более точно сопоставляться с объектно-ориентированным макетом, чем с строками/столбцами.

На большинстве платформ имеется ряд инструментов для сериализации. Например, похоже, что вы говорите о .NET - так что BinaryFormatter (.NET-specific), XmlSerializer, DataContractSerializer, Json.NET и protobuf-net/dotnet-protobufs будут квалифицироваться.

5

Сериализация = размещение соответствующего состояния объекта в потоковом представлении. Это может означать преобразование его в поток байтов. Это необязательно включает в себя копирование каждой переменной-члена в поток. Классический пример, который использует Джошуа Блох в Эффективной Java, - это HashSet. Вы просто сериализуете элементы в Hashset, но не в ключах.

Deserialization = восстановление объекта из последовательного представления и обеспечение инвариантов объекта. Десериализацию можно рассматривать как отдельный конструктор объекта. В случае упомянутого выше HashSet вы создадите новый HashSet, а затем вставьте значения из потока в эту новую структуру данных.

+0

для этимологических советов. Сериализация выводит объект * tree * (иерархический) в последовательное (плоское) представление, не теряя семантики. –

+0

Это не имеет никакого отношения к тому, конденсируете ли вы это от «дерева» до «плоского» представления. Вы можете сериализоваться в базу данных, которая все еще находится в древовидном формате, и десериализовать ее. Это не имеет значения. –

+0

Я не думаю, что в общем случае версия db - это серийная версия объекта. Данные, содержащиеся в объекте, можно разделить на несколько таблиц. Идея сериализации заключается в создании представления, которое может передаваться по частям (то есть последовательно). – jens

3

Сериализация означает, что вы сохраняете свой объект в представлении, которое вы можете хранить где-нибудь. Один из способов сделать это - просто взять указатель на то, где ваш объект хранится в памяти, и записать каждый байт, как в файл.Поскольку это представление очень специфично для вашего языка программирования (и как оно представляет объекты в памяти), улучшением будет преобразование вашего объекта в представление String, которое имеет определенную хорошо известную структуру (например, XML или JSON), так что вы может

а) передать его легче

б) магазин и восстановить его легче

с) Так как все знают, как определяется формат, любые другие программы могут читать ваш объект, тоже

Так помещение объекта в базу данных - это еще одна форма сериализации.

Deserialization означает, что вы можете снова загрузить и восстановить этот объект из того места, где вы его сохранили.

0

Сериализация

Сериализация представляет собой процесс преобразования объекта или набора объектов графа в поток.

Десериализация

Десериализация это процесс преобразования обратно потока в объект или набор графа объектов.

Вот некоторые пользовательские атрибуты:

[OnDeserialization] -> Он используется, когда необходимо выполнить какие-то действия во время десериализации потока. [OnDeserialized] -> Он используется, когда нам нужно выполнить какое-либо действие после десериализации потока в объект. Такие, как установка значения поля объекта правильно

Ниже приведен пример

[Serializable] 
    internal class DemoForSerializableAndDeserializable 
    { 
     internal string Fname = string.Empty; 
     internal string Lname = string.Empty; 

     internal Stream SerializeToMS(DemoForSerializableAndDeserializable objDemo) 
     { 
      DemoForSerializableAndDeserializable objSer = new DemoForSerializableAndDeserializable(); 
      MemoryStream ms = new MemoryStream(); 
      BinaryFormatter bf = new BinaryFormatter(); 
      bf.Serialize(ms, objSer); 
      return ms; 
     } 

     [OnDeserializing] 
     private void OnDeserializing(StreamingContext context) 
     { 
      // Do some work while deserializing the stream 
     } 
     [OnDeserialized] 
     private void OnSerialized(StreamingContext context) 
     { 
      Fname = "abc"; 
     } 

    } 

телефонный код

class CallingCode 
    { 
     string fname = string.Empty; 
     string Lname = string.Empty; 

     static void Main(string[] args) 
     { 
      DemoForSerializableAndDeserializable demo = new DemoForSerializableAndDeserializable(); 

      Stream ms = demo.SerializeToMS(demo); 
      ms.Position = 0; 

      DemoForSerializableAndDeserializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializableAndDeserializable; 

      Console.WriteLine(demo1.Fname); 
      Console.WriteLine(demo1.Lname); 
      Console.ReadLine(); 
     } 

    } 
Смежные вопросы