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