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