Пошаговое руководство. Сериализация коллекций стандартных типов

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

Внимание

Это содержимое было написано для платформа .NET Framework. Если вы используете .NET 6 или более позднюю версию, используйте это содержимое с осторожностью. Система конструктора изменилась для Windows Forms, и важно ознакомиться с изменениями конструктора после платформа .NET Framework статьи.

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

Необходимые компоненты

Для выполнения шагов, описанных в этом руководстве, вам понадобится Visual Studio.

Создание элемента управления с сериализуемой коллекцией

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

  1. В Visual Studio создайте проект библиотеки элементов управления Windows и присвойте ему имя SerializationDemoControlLib.

  2. Переименуйте UserControl1 в SerializationDemoControl. Дополнительные сведения см. в разделе Рефакторинг для переименования символов кода.

  3. В окне свойств присвойте свойству Padding.All значение 10.

  4. Поместите элемент управления TextBox в SerializationDemoControl.

  5. Выберите элемент управления TextBox. В окне свойств задайте следующие свойства.

    Свойство Изменить на
    Multiline true
    Док Fill
    ScrollBars Vertical
    ReadOnly true
  6. В редакторе кода объявите поле массива строк с именем 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
    
  7. Определите свойство 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
    
  8. Нажмите клавишу F5, чтобы собрать проект и запустить элемент управления в тестовом контейнере элементов UserControl.

  9. Найдите свойство Strings в PropertyGridтестового контейнера элементов UserControl. Выберите свойство Strings, а затем нажмите кнопку с многоточием (The Ellipsis button (...) in the Properties window of Visual Studio), чтобы открыть редактор коллекции строк.

  10. Введите несколько строк в редакторе набора строк. Разделите их, нажимая клавишу ВВОД в конце каждой строки. По завершении ввода строк нажмите кнопку OK.

Примечание.

Введенные вами строки отображаются в TextBoxSerializationDemoControl.

Сериализация свойства коллекции

Чтобы проверить поведение сериализации элемента управления, поместите его на форму и измените содержимое коллекции в редакторе коллекции. Чтобы увидеть состояние сериализованной коллекции, просмотрите специальный файл конструктора, в который выдает код конструктор Windows Forms.

  1. Добавьте проект приложения Windows в решение. Присвойте проекту имя SerializationDemoControlTest.

  2. На панели элементов найдите вкладку с именем Компоненты SerializationDemoControlLib. На этой вкладке имеется SerializationDemoControl. Дополнительные сведения см. в разделе Пошаговое руководство. Автоматическое заполнение панели элементов пользовательскими компонентами.

  3. Поместите SerializationDemoControl в форму.

  4. Strings Найдите свойство в окне "Свойства". Strings Щелкните свойство, а затем нажмите кнопку с многоточием (The Ellipsis button (...) in the Properties window of Visual Studio.), чтобы открыть редактор коллекции строк.

  5. Введите несколько строк в редакторе набора строк. Разделите их, нажимая клавишу ВВОД в конце каждой строки. По завершении ввода строк нажмите кнопку OK.

    Примечание.

    Введенные вами строки отображаются в TextBoxSerializationDemoControl.

  6. В обозревателе решений нажмите кнопку Показать все файлы.

  7. Откройте узел Form1. Под ним находится файл с именем Form1.Designer.cs или Form1.Designer.vb. Это файл, в который конструктор Windows Forms выдает код, представляющий состояние формы и ее дочерних элементов управления во время разработки. Откройте этот файл в редакторе кода.

  8. Откройте область с именем Код, созданный конструктором Windows Forms, и найдите раздел с меткой serializationDemoControl1. Под этой меткой находится код, представляющий сериализованное состояние элемента управления. Строки, введенные на шаге 5, отображаются в назначении свойству Strings. В следующих примерах кода в C# и Visual Basic показан код, аналогичный тому, который вы увидите, если введете строки "красный", "оранжевый" и "желтый".

    this.serializationDemoControl1.Strings = new string[] {
            "red",
            "orange",
            "yellow"};
    
    Me.serializationDemoControl1.Strings = New String() {"red", "orange", "yellow"}
    
  9. В редакторе кода измените значение DesignerSerializationVisibilityAttribute свойства Strings на Hidden.

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    
  10. Выполните сборку решения еще раз и повторите шаги 3 и 4.

Примечание.

В этом случае конструктор Windows Forms не выдает назначение свойству Strings.

Следующие шаги

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

См. также