У меня есть класс с более чем 100 свойствами (это класс сопоставления базы данных), и одно из свойств должно быть в методе. Другими словами, эти данные не отображаются через свойство, а через методы:
"ABCType GetABC(), SetABC (значение ABCType)"
Все это очень не похоже на С#. Я содрогаюсь, когда вижу это.
Класс должен быть сериализуемым, чтобы его можно было пересылать через веб-службы, а также данные, полученные методами Get/Set, также должны быть сериализованы. (В методе из-за странной вещи, которую я использую сетью, отражается, она не может обрабатывать объекты, которые содержат свойства того же типа, что и содержащий объект. Свойство проблемы сохраняет исходное состояние объекта базы данных в Если требуется реверс. Неэффективная реализация, да, но я не могу ее перестроить.)
Мой вопрос таков: поскольку только этому полю 1 требуется специальный код сериализации, я бы хотел использовать пользовательскую сериализацию только для вызова GetABC и SetABC, возвращаясь к базовой сериализации XML для остальной части класса. Это минимизирует вероятность ошибок в моем коде сериализации. Есть ли способ?
Первое, что я попробую, это добавить свойство для сериализации, но скрывать его от пользовательского интерфейса:
[Browsable(false)] // hide in UI
public SomeType ABC {
get {return GetABC();}
set {SetABC(value);}
}
К сожалению, вы не можете смешивать и сопоставлять сериализацию; как только вы реализуете IXmlSerializable
, вы владеете всем. Если вы использовали WCF, то DataContractSerialier
поддерживает непубличные свойства для сериализации, поэтому вы можете использовать:
[DataMember]
private SomeType ABC {
get {return GetABC();}
set {SetABC(value);}
}
но это не относится к веб-сервисам asmx через XmlSerializer
.
Работает ли трюк [Browsable]
вообще? Предполагая, что пользовательская сетка использует TypeDescriptor
, другой вариант может заключаться в том, чтобы скрыть ее с помощью ICustomTypeDescriptor
, но это большая работа, чтобы скрыть свойство...