Действительно ли возможно десериализовать свойства объектов, с помощью какого-либо из стандартных сериализаторов, не создавая новый объект?
Проблема, рассматриваемые объекты очень сложны (они могут только быть созданы специальной фабрикой, и их типы динамично сгенерированы во времени выполнения), но у них есть некоторые известные свойства, которые я хотел бы сохранить во внешнем файле (предпочтительно xml, но двоичный файл в порядке также), и позже (возможно после того, как приложение перезапущено), я хочу, чтобы сохраненные свойства были задержаны к объекту, который я обеспечиваю.
Кажется, что все стандартные сериализаторы могут только генерировать новый объект для меня (который также требует общедоступного конструктора без параметров), от которого я должен был бы вручную присвоить все свойства. Это очень не отличается от ручной сериализации, которой я хотел бы избежать, так как ряд сериализированных свойств является довольно большим и вероятно собирается измениться несколько раз в течение времени жизни проекта. В этой точке я вполне близко к записи моего собственного легкого сериализатора, но возможно кто-то мог предложить более стандартный способ сделать такие вещи?
protobuf-net имеет метод Serializer.Merge
, который позволяет десериализовать существующий экземпляр. Записываются только значения, найденные в потоке (он не стирает объект).
Не Microsoft, но довольно стабильный.
Чтобы расширить это; получение надежной сериализации, которая обрабатывает все распространенные сценарии, - это (я знаю по своему болезненному опыту) много работы. Я определенно рекомендую повторно использовать существующий код, где это возможно. protobuf-net, кажется, предлагает все, что вам нужно; текущие двоичные файлы просто требуют, чтобы вы украсили свой класс (очень похоже на [DataContract]
из WCF - на самом деле он даже поддерживает [DataContract]
/ [DataMember]
) ), но есть работа, позволяющая ему работать даже против POCO, поэтому вы можете использовать его с типами, находящимися вне вашего контроля.
Вы можете реализовать свой собственный гибкий «сериализатор», чтобы справиться с этим. Reflection предоставляет вам все необходимое.
Вы можете использовать метод FormatterServices.PopulateObjectMembers , который, кажется, специально разработан для этой задачи ...
{{ 1}}