Пошаговое руководство: Сериализация коллекций стандартных типов данных
Пользовательские элементы управления иногда предоставляют доступ к коллекции в качестве свойства. В этом пошаговом руководстве показано, как использовать класс DesignerSerializationVisibilityAttribute для управления сериализацией коллекции во время разработки. Применение значения Content к свойству коллекции гарантирует сериализацию свойства.
Осторожность
Это содержимое было написано для .NET Framework. Если вы используете .NET 6 или более позднюю версию, используйте это содержимое с осторожностью. Система конструктора изменилась для Windows Forms и важно просмотреть изменения конструктора с момента статьи .NET Framework.
Чтобы скопировать код в этом разделе в виде одного списка, см. Как: сериализовать коллекции стандартных типов с атрибутом DesignerSerializationVisibilityAttribute.
Необходимые условия
Для выполнения этого пошагового руководства вам потребуется Visual Studio.
Создание элемента управления с сериализуемой коллекцией
Первым шагом является создание элемента управления, имеющего сериализуемую коллекцию в качестве свойства. Содержимое этой коллекции можно изменить с помощьюредактора коллекций
В Visual Studio создайте проект библиотеки элементов управления Windows и назовите его SerializationDemoControlLib.
Переименуйте
UserControl1
вSerializationDemoControl
. Для получения дополнительной информации см. раздел «Переименование символов кода: рефакторинг».В окне Свойства задайте для свойства Padding.All значение 10.
Поместите элемент управления TextBox в
SerializationDemoControl
.Выберите элемент управления TextBox. В окне свойств задайте следующие свойства.
Имущество Переход на Многострочный true
док-станция Fill ScrollBars Vertical Только для чтения true
В редакторе кода объявите поле массива строк с именем
stringsValue
вSerializationDemoControl
.// This field backs the Strings property. private: array<String^>^ stringsValue;
// This field backs the Strings property. private String[] stringsValue = new String[1];
' This field backs the Strings property. Private stringsValue(1) As String
Определите свойство
Strings
вSerializationDemoControl
.Заметка
Значение Content используется для обеспечения сериализации коллекции.
// When the DesignerSerializationVisibility attribute has // a value of "Content" or "Visible" the designer will // serialize the property. This property can also be edited // at design time with a CollectionEditor. public: [DesignerSerializationVisibility( DesignerSerializationVisibility::Content)] property array<String^>^ Strings { array<String^>^ get() { return this->stringsValue; } void set(array<String^>^ value) { this->stringsValue = value; // Populate the contained TextBox with the values // in the stringsValue array. StringBuilder^ sb = gcnew StringBuilder(this->stringsValue->Length); for (int i = 0; i < this->stringsValue->Length; i++) { sb->Append(this->stringsValue[i]); sb->Append(Environment::NewLine); } this->demoControlTextBox->Text = sb->ToString(); } }
// When the DesignerSerializationVisibility attribute has // a value of "Content" or "Visible" the designer will // serialize the property. This property can also be edited // at design time with a CollectionEditor. [DesignerSerializationVisibility( DesignerSerializationVisibility.Content )] public String[] Strings { get { return this.stringsValue; } set { this.stringsValue = value; // Populate the contained TextBox with the values // in the stringsValue array. StringBuilder sb = new StringBuilder(this.stringsValue.Length); for (int i = 0; i < this.stringsValue.Length; i++) { sb.Append(this.stringsValue[i]); sb.Append("\r\n"); } this.textBox1.Text = sb.ToString(); } }
' When the DesignerSerializationVisibility attribute has ' a value of "Content" or "Visible" the designer will ' serialize the property. This property can also be edited ' at design time with a CollectionEditor. <DesignerSerializationVisibility( _ DesignerSerializationVisibility.Content)> _ Public Property Strings() As String() Get Return Me.stringsValue End Get Set(ByVal value As String()) Me.stringsValue = Value ' Populate the contained TextBox with the values ' in the stringsValue array. Dim sb As New StringBuilder(Me.stringsValue.Length) Dim i As Integer For i = 0 To (Me.stringsValue.Length) - 1 sb.Append(Me.stringsValue(i)) sb.Append(ControlChars.Cr + ControlChars.Lf) Next i Me.textBox1.Text = sb.ToString() End Set End Property
Нажмите F5, чтобы создать проект и запустить элемент управления в контейнере тестов UserControl.
Найдите свойство
Strings вконтейнера тестов UserControl. Выберите свойство строк , затем нажмите кнопку с многоточием (. Введите несколько строк в редакторе коллекции строк . Разделите их, нажав клавишу ВВОД после каждой строки. Нажмите кнопку ОК после завершения ввода строк.
Заметка
Строки, которые вы ввели, появляются в TextBoxSerializationDemoControl
.
Сериализуйте свойство коллекции
Чтобы проверить поведение сериализации элемента управления, вы поместите его в форму и измените содержимое коллекции с помощью редактора коллекций. Состояние сериализованной коллекции можно увидеть, просмотрев специальный файл конструктора, в который конструктор Windows Forms генерирует код.
Добавьте проект приложения Windows в решение. Присвойте проекту имя
SerializationDemoControlTest
.На панели элементов найдите вкладку с названием SerializationDemoControlLib Components. На этой вкладке вы найдете
SerializationDemoControl
. Дополнительные сведения см. в пошаговом руководстве «Автоматическое заполнение панели элементов пользовательскими компонентами».Поместите
SerializationDemoControl
в вашу форму.Найдите свойство
Strings
в окне "Свойства ". Щелкните свойство, а затем нажмите кнопку с многоточием ( ) для открытияредактора коллекции строккнопку с многоточием (...) в окне свойств Visual Studio. . Введите несколько строк в редакторе строк коллекции. Разделите их, нажимая ВВОД в конце каждой строки. Нажмите кнопку ОК после завершения ввода строк.
Заметка
Строки, которые вы ввели, появляются в TextBox внутри
SerializationDemoControl
.В обозревателе решений нажмите кнопку Показать все файлы.
Откройте узел Form1. Под ним находится файл с именем Form1.Designer.cs или Form1.Designer.vb. Это файл, в который конструктор Windows Forms выдает код, представляющий состояние времени разработки формы и его дочерних элементов управления. Откройте этот файл в редакторе кода .
Откройте регион с именем конструкторе форм Windows Form, созданный, и найдите раздел, помеченный serializationDemoControl1. Под этой меткой находится код, представляющий сериализованное состояние элемента управления. Строки, введенные на шаге 5, отображаются в назначении свойству
Strings
. В следующих примерах кода в C# и Visual Basic отображается код, аналогичный тому, что вы увидите, если вы ввели строки "красный", "оранжевый" и "желтый".this.serializationDemoControl1.Strings = new string[] { "red", "orange", "yellow"};
Me.serializationDemoControl1.Strings = New String() {"red", "orange", "yellow"}
В редакторе кода измените значение DesignerSerializationVisibilityAttribute свойства
Strings
на Hidden.[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Перестройте решение и повторите шаги 3 и 4.
Заметка
В этом случае конструктор Windows Forms не выдает назначения свойству Strings
.
Дальнейшие действия
После того как узнаете, как сериализовать коллекцию стандартных типов, рассмотрите возможность более глубокой интеграции пользовательских элементов управления в среду разработки на этапе проектирования. В следующих разделах описывается, как улучшить интеграцию пользовательских элементов управления во время разработки:
См. также
.NET Desktop feedback