Пошаговое руководство. Сериализация коллекций стандартных типов
Пользовательские элементы управления иногда будут предоставлять коллекцию как свойство. В этом пошаговом руководстве показан процесс использования класса 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. В окне свойств задайте следующие свойства.
Свойство Изменить на Multiline true
Док Fill ScrollBars Vertical ReadOnly 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 в PropertyGridтестового контейнера элементов UserControl. Выберите свойство Strings, а затем нажмите кнопку с многоточием (), чтобы открыть редактор коллекции строк.
Введите несколько строк в редакторе набора строк. Разделите их, нажимая клавишу ВВОД в конце каждой строки. По завершении ввода строк нажмите кнопку OK.
Примечание.
Введенные вами строки отображаются в TextBoxSerializationDemoControl
.
Сериализация свойства коллекции
Чтобы проверить поведение сериализации элемента управления, поместите его на форму и измените содержимое коллекции в редакторе коллекции. Чтобы увидеть состояние сериализованной коллекции, просмотрите специальный файл конструктора, в который выдает код конструктор Windows Forms.
Добавьте проект приложения Windows в решение. Присвойте проекту имя
SerializationDemoControlTest
.На панели элементов найдите вкладку с именем Компоненты SerializationDemoControlLib. На этой вкладке имеется
SerializationDemoControl
. Дополнительные сведения см. в разделе Пошаговое руководство. Автоматическое заполнение панели элементов пользовательскими компонентами.Поместите
SerializationDemoControl
в форму.Strings
Найдите свойство в окне "Свойства".Strings
Щелкните свойство, а затем нажмите кнопку с многоточием (), чтобы открыть редактор коллекции строк.Введите несколько строк в редакторе набора строк. Разделите их, нажимая клавишу ВВОД в конце каждой строки. По завершении ввода строк нажмите кнопку OK.
Примечание.
Введенные вами строки отображаются в TextBox
SerializationDemoControl
.В обозревателе решений нажмите кнопку Показать все файлы.
Откройте узел Form1. Под ним находится файл с именем Form1.Designer.cs или Form1.Designer.vb. Это файл, в который конструктор Windows Forms выдает код, представляющий состояние формы и ее дочерних элементов управления во время разработки. Откройте этот файл в редакторе кода.
Откройте область с именем Код, созданный конструктором Windows Forms, и найдите раздел с меткой 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
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по