Конфигурирование объектов для сериализации

Чтобы сделать объект доступным для служб сериализации.NET, нужно декорировать каждый связанный класс (или структуру) атрибутом [Serializable].

Если выясняется, что некоторый тип имеет члены-данные, которые не должны (или не могут) участвовать в схеме сериализации (например, фиксированные значения, случайные значения, кратковременные данные и т.п.), можно пометить такие поля атрибутом [NonSerialized].

Атрибут [Serializable] не может наследоваться от родительского класса. Поэтому при наследовании типа, помеченного [Serializable], дочерний класс также должен быть помечен [Serializable] или же его нельзя будет сохранить в потоке. Фактически все объекты в графе объектов должны быть помечены атрибутом [Serializable]. Попытка сериализовать несериализуемый объект с использованием BinaryFormatter или SoapFormatter приводит к исключению SerializationException во время выполнения.

Общедоступные поля, приватные поля и общедоступные свойства

Если состояние объекта сохраняется с использованием BinaryFormatter или SoapFormatter, то видимость полей класса не имеет значения. Эти типы могут сериализовать любые данные класса, независимо от того, представлены они общедоступными (public) полями, приватными (private) полями или приватными полями с соответствующими общедоступными свойствами.

Однако при использовании XmlSerializer будут сериализоваться только сериализуемые общедоступные поля данных или приватные поля, представленные общедоступными свойствами. Приватные данные, не представленные свойствами, просто игнорируются. Например для класса

[Serializable]

public class Person

{

// Общедоступное поле.

public bool isAlive = true;

// Приватное поле.

private int personAge = 21;

// Общедоступное свойство/приватные данные.

private string fName = string. Empty;

public string FirstName

{

get { return fName; }

set { fName = value; }

}

}

При обработке BinaryFormatter или SoapFormatter обнаружится, что поля isAlive, personAge и fName сохраняются в выбранном потоке. Однако XmlSerializer не сохранит значения personAge, поскольку эта часть приватных данных не инкапсулирована в свойство.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: