Что такое сериализация и десериализация объектов? - PullRequest
13 голосов
/ 01 сентября 2009

Что такое объект сериализация и десериализация ?

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

Ответы [ 5 ]

20 голосов
/ 01 сентября 2009

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

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

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

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

6 голосов
/ 01 сентября 2009

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

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

3 голосов
/ 01 сентября 2009

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

а) перенести его проще

б) Хранить и восстанавливать его проще

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

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

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

1 голос
/ 01 сентября 2009

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

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

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

  • XmlSerialization
  • BinarySerialization

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

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

0 голосов
/ 11 апреля 2017

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

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

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

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

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

[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();
        }

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