Смешивание пользовательских и базовых сериализаций?

1

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

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

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

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

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

Теги:
serialization

1 ответ

2
Лучший ответ

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

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

  • 0
    Трюк [Browsable] не работает, потому что он не будет скрывать свойство от вызова сетки к typeof (SomeType) .GetProperties (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); Однако вы ответили на вопрос о смешанной сериализации, так что спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню