2009-01-17 3 views
0

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

Брэд

BTW это окно приложению

EDIT:

, что я в настоящее время InPlace является функцией общественного элемента, который использует класс 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 - благодаря

+0

Вы используете сериализацию? –

+0

Просто интересно, но зачем сберегать элементы управления на диске? – Juliet

+0

Принцесса: приложение отправляет файл на удаленный компьютер для отображения данных процесса на 52-дюймовом ЖК-дисплее – Brad

ответ

1

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

+0

+1 для ISerializable.. –

1

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

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

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

+0

. У меня был вариант XML, работающий некоторое время, но я мечтал о других методах экономии памяти, которые я мог использовать. – Brad

+0

Я использую PropertyDescriptorCollection = TypeDescriptor.GetProperties PDC (это); Foreach (PropertyDescriptor П.Д. в КИД) собрать все свойства, необходимые мне для отдыха – Brad

0

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

Смежные вопросы