Программно свойства набора для исключения из сериализации

Действительно ли возможно программно установить это, Вы хотите исключить свойство из сериализации?

Пример:

  • При десериализации я хочу загрузить поле ID
  • При сериализации я хочу НЕ произвести поле ID
11
задан p.campbell 5 August 2013 в 03:32
поделиться

5 ответов

Я думаю, что здесь есть три варианта:

  1. Использовать атрибут XmlIgnore. Недостатком является то, что вам нужно заранее знать, какие свойства вы хотите, чтобы xmlserializer игнорировал.

  2. Реализуйте интерфейс IXmlSerializable. Это дает вам полный контроль над выводом XML, но вы должны сами реализовать методы чтения/записи.

  3. Реализуйте интерфейс ICustomTypeDescriptor. Я считаю, что это заставит ваше решение работать независимо от того, какой тип сериализации вы выберете, но это, вероятно, самое длинное решение из всех.

19
ответ дан 3 December 2019 в 00:56
поделиться

Зависит от типа сериализации. Вот полный пример этого с BinaryFormatter:

Вы можете использовать OnDeserializedAttribute :

[Serializable]
class SerializableEntity
{
  [OnDeserialized]
  private void OnDeserialized()
  {
    id = RetrieveId();
  }

  private int RetrievId() {}

  [NonSerialized]
  private int id;
}

И есть другой способ сделать это, используя IDeserializationCallback :

[Serializable]
class SerializableEntity: IDeserializationCallback 
{
  void IDeserializationCallback.OnDeserialization(Object sender) 
  {
    id = RetrieveId();
  }

  private int RetrievId() {}

  [NonSerialized]
  private int id;
}

Также вы можете прочитать замечательная статья Джеффри Рихтера о сериализации: часть 1 и часть 2 .

17
ответ дан 3 December 2019 в 00:56
поделиться

Если вы выполняете сериализацию в XML, вы можете использовать XMLIgnore

Как в:

class SomeClass
{
  [XmlIgnore] int someID;
  public string someString;
}
5
ответ дан 3 December 2019 в 00:56
поделиться

Если вы хотите включить поле при сериализации, но игнорировать его при десериализации, вы можете использовать OnDeserializedAttribute для запуска метода, который установит значение по умолчанию для поля ID.

4
ответ дан 3 December 2019 в 00:56
поделиться

Если используется XML-сериализация, используйте атрибут [XmlIgnore]. В противном случае способ игнорирования того или иного свойства определяется самим сериализатором.

2
ответ дан 3 December 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: