Десериализация свойств в существующий ранее объект

Действительно ли возможно десериализовать свойства объектов, с помощью какого-либо из стандартных сериализаторов, не создавая новый объект?

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

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

5
задан Chriso 26 February 2010 в 12:38
поделиться

3 ответа

protobuf-net имеет метод Serializer.Merge , который позволяет десериализовать существующий экземпляр. Записываются только значения, найденные в потоке (он не стирает объект).

Не Microsoft, но довольно стабильный.

Чтобы расширить это; получение надежной сериализации, которая обрабатывает все распространенные сценарии, - это (я знаю по своему болезненному опыту) много работы. Я определенно рекомендую повторно использовать существующий код, где это возможно. protobuf-net, кажется, предлагает все, что вам нужно; текущие двоичные файлы просто требуют, чтобы вы украсили свой класс (очень похоже на [DataContract] из WCF - на самом деле он даже поддерживает [DataContract] / [DataMember] ) ), но есть работа, позволяющая ему работать даже против POCO, поэтому вы можете использовать его с типами, находящимися вне вашего контроля.

3
ответ дан 14 December 2019 в 19:11
поделиться

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

0
ответ дан 14 December 2019 в 19:11
поделиться

Вы можете использовать метод FormatterServices.PopulateObjectMembers , который, кажется, специально разработан для этой задачи ...

{{ 1}}
0
ответ дан 14 December 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: