Переопределение сериализации для определенного типа .NET
-
05-07-2019 - |
Вопрос
Пожалуйста, рассмотрите этот пример класса:
[Serializable]
public class SomeClass
{
private DateTime _SomeDateTime;
public DateTime SomeDateTime
{
get { return _SomeDateTime; }
set { _SomeDateTime = value; }
}
}
Я хотел бы изменить сериализацию любого DateTime, объявленного в классе, согласно моим собственным правилам. Члены этого класса будут часто меняться, и я не хочу поддерживать собственный сериализатор для каждого изменения. Также я хотел бы, чтобы это поведение наследовалось подклассами, а не кодировало пользовательский сериализатор для каждого. Сериализация выводится веб-службой. Спасибо за любую помощь!
Решение
посмотрите на атрибуты OnSerializing и OnDeserializing для вызова пользовательских методов при сериализации ваших объектов. вы можете использовать некоторую пользовательскую логику и отделить процесс сериализации от реальных типов данных.
Другие советы
Задумывались ли вы просто об использовании значения даты со значением Nullable
public DateTime? SomeDateTime {get; set;}
Таким образом, вы можете иметь нулевое значение в качестве допустимого значения в вашем классе. Как правило, вы хотите избежать пользовательской сериализации, когда это возможно. После того как вы выполните пользовательскую сериализацию, например, внедрите ISerializable , тогда вы застряли с ним, а все остальные производные классы застряли с ним.
Помните, какая боль в заднице - всегда переопределять элементы ISerializable для пользовательских исключений? Это связано с тем, что System.Exception реализует ISerializable, и поэтому все производные исключения (что означает все) должны реализовывать эти элементы, если вы когда-либо ожидаете, что они пересекают домены приложений.
Ну, вы можете использовать " bool ShouldSerializeSomeDateTime () " способ включить / отключить сериализацию отдельных членов, но я не думаю, что это именно то, что вам нужно. Другим распространенным вариантом является добавление члена, который выполняет сам формат:
открытая строка SomeDateTimeFormatted { получить {вернуть theField == DateTime.MinValue? & Quot; & Quot; : theField.ToString (" R ");} // или любой другой формат установить {... противоположный ...} } Р>
Тем не менее, лучше придерживаться встроенной сериализации, если вы можете - частично, чтобы уменьшить объем кода, который вам нужно написать. Предложение Джоша для обнуляемого DateTime (DateTime?) Является хорошим, хотя оно может все еще быть не совсем пустой строкой, а форматированной строкой - я ожидаю, что будет использоваться разметка xsi: nil.