Свойства не будут сериализованы в файл .designer.cs - PullRequest
3 голосов
/ 28 июня 2010

В 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 Ответ

9 голосов
/ 28 июня 2010

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

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

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

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

...