Переопределение сериализации для определенного типа .NET

StackOverflow https://stackoverflow.com/questions/173886

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top