ссылка на объект после сериализации и десериализации - PullRequest
1 голос
/ 03 марта 2011

Почему после десериализации ссылка на объект не такая, как была до сериализации.

хорошо, позвольте мне объяснить это

У меня есть строка

string test ="TestString";

Теперь я делаю серилизацию

                  DataContractJsonSerializer _DataContractJsonSerializer
          = new DataContractJsonSerializer(typeof(string));

                       MemoryStream ms = new MemoryStream();
            _DataContractJsonSerializer.WriteObject(ms, test);
            var jsonString = Encoding.Default.GetString(ms.ToArray());

Теперь я делаю десерилизацию из jsonstring в фактическое значение

        MemoryStream ms1 =
            new MemoryStream(Encoding.Unicode.GetBytes(jsonString));
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(string));
            string DeseriliaedStrring = serializer.ReadObject(ms1) as string;

здесь, в DeseriliaedStrring, я получил фактическое значение, ноесли я проверю там ссылки, они не равны

bool isReferenceEqual = object.ReferenceEquals(DeseriliaedStrring, test);

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Сериализация создает копии значений объекта. Десериализация создает совершенно новый экземпляр с скопированными значениями.

Отредактируйте в ответ на ваш комментарий ниже: десериализация не вызывает конструктор. Если это проблема, переопределите с помощью ISerializable. Это будет сериализовано на основе вызова ISerializable.GetObjectData, а затем вызовет определенный конструктор с полями SerializationInfo и StreamingContext.

1 голос
/ 03 марта 2011

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

  • У вас есть экземпляр объекта
  • Вы создаете экземпляр строки, который является представлением этого экземпляра объекта
  • Вы создаетеэкземпляр объекта, основанный на сериализованных данных в строке

Если учесть, что исходный экземпляр мог мутировать, что десериализация может произойти в другом процессе, даже на другом компьютере, он становится довольноЯсно, что десериализация не может вернуть исходный экземпляр.

В этом конкретном случае, когда объект является String, вы можете представить, что интернирование строк заставит систему повторно использовать старый экземпляр (если десериализацияпроизошло в том же AppDomain).Но это, вероятно, * потребовало бы DataContractJsonSerializer, чтобы знать об этом, что сделало бы его излишне сложным.

*) На самом деле я не совсем уверен, точно какая частьсистема, которая заботится о интернировании строк.

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