Главная » C# » Тонкая настройка сериализации в Visual C# (Sharp)

0

Когда имеем дело с сериализацией, может возникнуть ситуация, когда определеый текстовый или двоичный формат требует дополнительной обработки. Кроме этого, может быть желательным не подвергать сериализации некоторые объекты.

Специальная сериализация

Иногда мне кажется, что существует столько файловых форматов, сколько песчок на пляже. Тем не менее, в большинстве случаев сериализация будет выполной. Но в некоторых случаях может  быть необходимым выполнить тонкую нтройку сериализации.

Многие способы сериализации позволяют индивидуальную сериализацию опреденного объекта. Сериализация по умолчанию подразумевает определенный мааллинг.  Например, это  может означать,  что  целое число  будет  маршаллизовано в  другое  представление  как  целое  число.  Но  иногда  может  быть  желательным в разных потоках иметь различные представления. В таком случае необходимо реализовать маршаллинг члена данных самостоятельно. Для большинства плаорм сериализации означает реализацию определенного интерфейса.

Далее приводится исходный код для выполнения индивидуальной сериализации двоичного потока .NET:

[Serializable]

class MyObject : ISerializable { int value;

public MyObject() { }

public MyObject(Serializationlnfo info, StreamingContext context) { size = int.Parse(info.GetValue("value", typeof(string)));

}

public void GetObjectData(Serializationlnfo info, StreamingContext context) {

info.AddValue("value", value.ToString());

}

}

В данном примере реализуется интерфейс System. Runtime. Serialization. ISeria- lizable. Это означает, что когда форматер BinaryFormatter выполняет сериализию или десериализацию, то форматер BinaryFormatter объекта MyObject не будет манипулировать двоичным потоком, а делегирует эту задачу объекту MyObject. Многие платформы сериализации имеют явный метод, свойство или флаг для укания,  записывается  ли  MyObject в  поток  или  же  считывается  из  него.  В  случае с двоичной сериализацией, когда объект записывается в поток, вызывается метод GetObjectData (), а когда считывается, то вызывается конструктор MyObject ().

Сериализация идет в двух направлениях,  и  разработчик должен  реализовать  их оба и одинаковым способом. В примере вызывается метод AddvalueO, указывая, что член данных записывается в виде строки и должен считываться также в виде строки.

ПРИМЕЧАНИЕ

Одной из самых больших проблем с сериализацией является то, что каждая  плаорма сериализации, кажется, имеет собственный способ работы. Иногда могут быть общие методы и атрибуты, но в других случаях их нет. Универсального подхода к сиализации не существует. Следует избегать выполнения индивидуальной сериалации всегда, когда это возможно. Большинство платформ сериализации достаточно разумно и знает, что делать с каждым членом данных.  Поэтому лучшим подходом бет предоставить платформе сериализации возможность вычислить, каким образом выполнить  задачу.

Объявление члена данных не подлежащим сериализации

В примере с типом Ticket все члены данных можно было сериализовать.  Но инда это нежелательно. Допустим, что объект, который вы хотите  сериализовать, имеет сетевое подключение. При сериализации объекта сетевое подключение тае будет сериализовано, что неправильно. Сетевое подключение не следует сериизовывать по той причине, что этот объект является временным и применим толо в контексте экземпляра объекта.

Часто для пометки объекта, не подлежащего сериализации, применяются атрибуты, как показано в следующем примере:

[Serializabie] class MyObject2 {

[NonSerialized]

private int  networkIdentif ier;

}

Здесь объект _networkidentifier не будет записываться или считываться из пота данных.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии