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