Поделиться через


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

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

    Имущество Переход на
    Многострочный true
    док-станция Fill
    ScrollBars Vertical
    Только для чтения 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 в контейнера тестов UserControl. Выберите свойство строк , затем нажмите кнопку с многоточием (), чтобы открыть редактор коллекции строк в окне свойств Visual Studio.

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

Заметка

Строки, которые вы ввели, появляются в TextBoxSerializationDemoControl.

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

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

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

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

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

  4. Найдите свойство Strings в окне "Свойства ". Щелкните свойство , а затем нажмите кнопку с многоточием (кнопку с многоточием (...) в окне свойств Visual Studio.) для открытияредактора коллекции строк .

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

    Заметка

    Строки, которые вы ввели, появляются в TextBox внутри SerializationDemoControl.

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

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

  8. Откройте регион с именем конструкторе форм Windows Form, созданный, и найдите раздел, помеченный 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.

Дальнейшие действия

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

См. также