Свойства не будут сериализованы в файл.designer.cs

В VS2010 свойства элемента управления не будут сериализованы, несмотря на метод ShouldSerializeFoo, в том числе с DesignerSerializationVisibility.Visible/Content.

Вот код:

class Class1 : UserControl {
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public string Foo {
        get; set;
    }
    public bool ShouldSerializeFoo() {
        return true;
    }
    public Class1() {
        Foo = "dupa";
    }
}

Однако дизайнер не генерирует ничего для этого свойства:

        // 
        // class11
        // 
        this.class11.Location = new System.Drawing.Point(224, 262);
        this.class11.Name = "class11";
        this.class11.Size = new System.Drawing.Size(150, 150);
        this.class11.TabIndex = 2;
        this.class11.Load += new System.EventHandler(this.class11_Load);

1 ответ

Решение

Вы смешиваете схемы сериализации. Сериализация дизайнера (что к чему DesignerSerializationVisibility для) не имеет ничего общего с механизмом сериализации экземпляра (что к чему ShouldSerializeXXX функции, среди прочего, имеют дело с).

DesignerSerializationVisibility.Content не имеет особого смысла для string (или любой другой неизменный тип). Дизайнер может просматривать сериализацию свойства как три типа:

  • Нет - он никогда не сериализует ничего о собственности
  • Видимый - он будет сериализовать фактическое значение свойства
  • Содержимое - это будет сериализовать значения свойств значения свойства.

По умолчанию свойство считается Visible, Я понимаю, что мое определение Content может быть немного запутанным. Что я имею в виду под этим:

public class MyControl : Control
{
    public class SomeOptions
    {
        public string Option1 { get; set; }
        public string Option2 { get; set; }
    }

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public SomeOptions Options { get; private set; }

    public string Foo { get; set; }
}

Теперь, когда этот класс сериализован дизайнером, он будет выглядеть примерно так:

// myControl1
this.myControl1.Foo = "value";
this.myControl1.Options.Option1 = "option1";
this.myControl1.Options.Option2 = "option2";

Надеюсь, это должно иметь больше смысла; пометить имущество как Content означает, что вместо сериализации фактического значения свойства (в этом случае это будет SomeOptions), вместо этого следует сериализовать значения свойств этого значения.

Итак, вернемся к вашему вопросу, поэтому вы не хотите Content для string имущество. Так как stringОни неизменны, и дизайнеру нечего сериализировать. Либо пометить как Visible или оставьте атрибут полностью выключенным (так как это по умолчанию).

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

[DefaultValue("foo")]
public string Foo { get; set; }

Если дизайнер видит, что значение Foo равно "foo"тогда он не будет сериализовать свойство вообще.

Другие вопросы по тегам