Переопределение сериализации для определенного типа .NET - PullRequest
3 голосов
/ 06 октября 2008

Пожалуйста, рассмотрите этот пример класса:

[Serializable]
public class SomeClass
{
    private DateTime _SomeDateTime;

    public DateTime SomeDateTime
    {
        get { return _SomeDateTime; }
        set { _SomeDateTime = value; }
    }
}

Я хотел бы изменить сериализацию любого DateTime, объявленного в классе, согласно моим собственным правилам. Члены этого класса будут часто меняться, и я не хочу поддерживать собственный сериализатор для каждого изменения. Также я хотел бы, чтобы это поведение наследовалось подклассами, а не кодировало пользовательский сериализатор для каждого. Сериализация выводится веб-службой. Спасибо за любую помощь!

Ответы [ 3 ]

3 голосов
/ 06 октября 2008

посмотрите на атрибуты OnSerializing и OnDeserializing для вызова пользовательских методов при сериализации ваших объектов. вы можете использовать некоторую пользовательскую логику и отделить процесс сериализации от реальных типов данных.

3 голосов
/ 06 октября 2008

Задумывались ли вы просто об использовании значения даты со значением Nullable

public DateTime? SomeDateTime {get; set;}

Таким образом, вы можете иметь нулевое значение в качестве допустимого значения в вашем классе. Как правило, вы хотите избежать пользовательской сериализации, когда это возможно. Как только вы выполните пользовательскую сериализацию, такую ​​как реализация ISerializable , вы застряли с ней, а все остальные производные классы застряли с ней.

Помните, какая боль в заднице всегда приходиться переопределять элементами ISerializable для пользовательских исключений? Это связано с тем, что System.Exception реализует ISerializable, и поэтому все производные исключения (что означает все) должны реализовывать эти члены, если вы когда-либо ожидаете, что они пересекают домены приложений.

0 голосов
/ 06 октября 2008

Ну, вы можете использовать метод "bool ShouldSerializeSomeDateTime ()", чтобы включить / отключить сериализацию отдельных членов, но я не думаю, что это именно то, что вам нужно. Другим распространенным вариантом является добавление члена, который выполняет сам формат:

публичная строка SomeDateTimeFormatted { получить {вернуть theField == DateTime.MinValue? "": theField.ToString ("R");} // или любой другой формат установить {... противоположный ...} }

Тем не менее, лучше придерживаться встроенной сериализации, если вы можете - частично, чтобы уменьшить объем кода, который вам нужно написать. Предложение Джоша для обнуляемого DateTime (DateTime?) Является хорошим, хотя оно может все еще не быть полностью пустой строкой по сравнению с форматированной строкой - я ожидаю, что будет использоваться разметка xsi: nil.

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