Почему System.Windows.Forms.Control не помечены как сериализуемые? - PullRequest
2 голосов
/ 03 февраля 2012

Я не могу глубоко копировать UserControls, потому что они не помечены как сериализуемые.

В чем причина этого дизайна?

Ответы [ 3 ]

11 голосов
/ 03 февраля 2012

Сериализация элемента управления не проблема, это десериализация , это невероятно сложно сделать правильно. Ожидается, что это приведет к клону точного элемента управления. Это почти невозможно сделать точно, с элементом управления связано огромное количество времени выполнения. Не только в самом объекте класса Control, но и во внутреннем состоянии окна, утверждается, что Windows не разрешает прямой доступ.

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

Тем не менее, дизайнер Winforms фактически поддерживает сериализацию управления. Не в байтах, он генерирует код . Код, который воссоздает элемент управления во время выполнения и выглядит так же, как во время разработки. За исключением целого ряда деталей, таких как размер и цвет, они часто оказываются разными на другой машине. Большим преимуществом конструктора является то, что ему нужно только сериализовать начальное состояние элемента управления, его состояние во время конструктора. Делать то же самое в любой момент после этого, после того как Windows создаст окно элемента управления и отправит ему кучу сообщений, гораздо сложнее взломать. Это заводская ошибка. И поэтому не поддерживается.

2 голосов
/ 03 февраля 2012

Пользовательские элементы управления являются визуальным элементом, и как таковой, почему вы бы хотели их сериализовать?Вы никогда не собираетесь отправлять их через службу WCF или передавать их в хранилище данных.Если вам нужно передать или сохранить пользовательские элементы управления, вы должны сохранить их ключевые свойства и воссоздать их при необходимости.

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

1 голос
/ 05 апреля 2014

Вы можете сериализовать элементы управления, но не через стандартные сериализаторы. Если вы хотите сериализовать один или несколько элементов управления в форме, чтобы сохранить дизайн формы и / или другие свойства элемента управления, вы можете использовать ту же сериализацию, что и Visual Studio (через CodeDomSerializer), но вам нужно реализовать несколько классов (я думаю, по крайней мере, IDesignerSerializationManager). Вы можете увидеть образец здесь

http://support.microsoft.com/default.aspx?scid=kb;en-us;813808

Сериализация в классе SampleDesignerLoader, метод Flush.

В этом же методе также есть сериализация в потоке XML, в которой не используются классы, используемые Visual Studio.

В том же классе происходит десериализация из XML.

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