Comments 6
Свойства не могут быть сделаны автоматическими, т.к. имена скрытых полей класса генерируются снова при каждой компиляцииВсегда называются как <ИмяСвойства>k__BackingField. Во всех известных компиляторах C#.
0
Если обратиться к четвертому изданию CLR via C#, то там явно говорится:
Do not use C#’s automatically implemented property feature to define properties inside types marked with the [Serializable] attribute, because the compiler generates the names of the fields and the generated names can be different each time that you recompile your code, preventing instances of your type from being deserializable.
0
(Не)ожиданно на консоль будет выведено false, а это значит, что мы получили два объекта-синглтона. Такой результат можно предвидеть, если вспомнить, что в процессе десериализации с помощью рефлексии вызывается приватный конструктор и все десериализуемые значения присваиваются новому объекту. Именно эта особенность синглтона кладет первый камень в наш сад: синглтон перестает быть синглтоном.Неверно. BinaryFormatter использует FormatterServices.GetSafeUninitializedObject, который позволяет создать экземпляр объекта без вызова конструктора. Два разных экземпляра вы получили из-за того что статическое поле уже было проинициализировано в статическом конструкторе, а десериализатор создал свой экземпляр объекта.
+1
Иногда приходится городить огород, да. Но почему-то хочется взять какой-нибудь DI фреймворк и забыть о прочтенном, как о страшном сне…
0
Sign up to leave a comment.
Singleton serialization или сад камней