Смешивание пользовательских и базовых сериализаций? - PullRequest
1 голос
/ 13 марта 2009

У меня есть класс с более чем 100 свойствами (это класс отображения базы данных), и одно из свойств должно быть в методе. Другими словами, эти данные предоставляются не через свойство, а через методы:

«ABCType GetABC (), SetABC (значение ABCType)»

Все это очень не похоже на C #. Я вздрагиваю, когда вижу это.

Класс должен быть сериализуемым, чтобы его можно было отправлять через веб-сервисы, а данные, предоставляемые методами Get / Set, также должны быть сериализованы. (Это в методе из-за странной вещи, которую сетка, которую я использую, делает с отражением; она не может обрабатывать объекты, которые содержат свойства того же типа, что и содержащий объект. Свойство problem сохраняет исходное состояние объекта базы данных в если требуется возврат. Неэффективная реализация, да - но я не могу его реорганизовать.)

У меня такой вопрос: поскольку для этого только 1 поля требуется настраиваемый код сериализации, я бы хотел использовать настраиваемую сериализацию только для вызова GetABC и SetABC, возвращаясь к базовой сериализации XML для остальной части класса. Это минимизирует вероятность ошибок в моем коде сериализации. Есть ли способ?

1 Ответ

2 голосов
/ 13 марта 2009

Первое, что я попробую, это добавить свойство для сериализации, но скрыть его от пользовательского интерфейса:

[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, но это большая работа, чтобы скрыть свойство ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...