C # Какой лучший способ сохранения динамически созданных элементов управления - PullRequest
0 голосов
/ 18 января 2009

В настоящее время я сохраняю пользовательский контроль .net (c #) на диск в виде файла XML, сохраняя каждое свойство как элемент в документе xml. Файл используется для последующего восстановления элементов управления во время выполнения. Мне интересно, если это возможно или лучше сохранить элемент управления в виде двоичного файла. Было бы много элементов управления, поэтому я предполагаю, что в нем должен быть раздел заголовка, описывающий расположение и длину каждого сохраненного элемента управления. Мысли

Бред

Кстати, это приложение для Windows

EDIT:

В настоящее время у меня есть открытая функция-член, которая использует класс propertyDescriptior для прохождения всех свойств и создания из этого XML-документа.

     PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this);

        for (int i = 0; i <= pdc.Count - 1; i++)
        {   pdc[i].Name
     pdc[i].PropertyType
    pdc[i].Category

}

Я посмотрю на создание класса Serializable - спасибо

Ответы [ 3 ]

1 голос
/ 18 января 2009

Мы должны были сделать это для приложения, управляемого данными, где пользователь мог создавать постоянные представления. Мы запустили XML-версию, но перешли к использованию BinaryFormatter и интерфейса ISerializable, поскольку это позволяет нам точно контролировать, что сохраняется и какие конструкторы использовать. Для элементов управления мы фактически сохранили созданный дизайнером CodeCompileUnit, но это означает, что вы должны использовать дизайнер для их размещения.

1 голос
/ 18 января 2009

Элементы управления Winforms не сериализуются особенно хорошо, и вам может быть очень трудно заставить базовые классы (т.е. не ваш код) играть в мяч. Такие вещи, как Color, например, регулярно доставляют удивительно хлопотные для сериализации.

XML будет очевидным (хотя и несколько предсказуемым) выбором, но обычно вам нужно заранее назначать подклассы. И, конечно, базовые классы не будут помечены как сериализуемые. BinaryFormatter позволит избежать этого, но как сериализатор на основе полей, у вас будут проблемы с «дескрипторами» и т. Д. В базовых классах, которые бессмысленно сериализуются.

Я не говорю, что это невозможно, но это тоже не будет тривиально. Для начала вам нужно посмотреть на TypeConverter.GetProperties и использовать Converter каждого, чтобы получить значение в виде инвариантной строки.

0 голосов
/ 18 января 2009

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

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