Свойства не будут сериализованы в файле .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);

person sthalik    schedule 28.06.2010    source источник


Ответы (1)


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

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

  • None — он никогда не сериализует ничего о свойстве
  • Видимый - он будет сериализовать фактическое значение свойства
  • Контент — сериализует значения свойства значения свойства.

По умолчанию свойство считается 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", он вообще не будет сериализовать свойство.

person Adam Robinson    schedule 28.06.2010
comment
Спасибо. Проблема на самом деле заключалась в том, что дизайнер кеширует вещи - очистка решения, удаление всех сериализуемых элементов управления, сохранение, а затем перезапуск VS заставили его работать. - person sthalik; 28.06.2010
comment
Адам, не могли бы вы попробовать это: stackoverflow.com/questions/13549351/. Спасибо! - person Brandon Moore; 25.11.2012