Как се работи със сериализация в .Net

Когато работите с приложения, често ще трябва да съхранявате данни в постоянен или непостоянен носител за съхранение, така че същите данни да могат да бъдат извлечени по-късно. Сериализацията, функция, предоставена от CLR, може да ви помогне да постигнете това.

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

Сериализацията е необходима, за да се предаде обект по проводника - това улеснява предаването на обект през мрежа. Следователно можете да използвате сериализацията, за да предадете обект от един домейн на приложение в друг. Можете също така да се възползвате от сериализацията, за да създадете клонинг на обект.

Въпреки това, сериализацията също е скъпа поради натоварването на ресурсите, участващо в сериализиране и десериализиране на обекти. За да работите със сериализация в .Net, трябва да се възползвате от пространството от имена System.Runtime.Serialization, т.е. трябва да включите това пространство от имена във вашата програма.

Можете да направите клас сериализуем, като използвате атрибута [Serializable]. Ето пример, който показва как можете да приложите този атрибут върху клас.

[Serializable]

public class Product

{

   public int productCode;

   public string productName;

}

Сега, ако искате да ограничите един или повече членове на клас от сериализиране, можете да използвате атрибута NonSerialized, както е показано в кодовия фрагмент, даден по-долу.

[Serializable]

    public class Product

    {

        public int productCode;

        public string productName;

        [NonSerialized()]

        public double productPrice;

    }

Рамката .Net осигурява поддръжка за следните видове сериализация.

  1. Двоична
  2. САПУН
  3. XML
  4. Персонализиран

Двоична сериализация

Бинарната сериализация е най-бързата от всички техники за сериализация - тя може да се използва за сериализиране на обект в двоичен поток. Това е вид сериализация, който може да се използва за сериализиране на обект в изходен поток, като същевременно се запазва идентичността на обекта - информацията за типа не се губи в процеса на сериализация. Имайте предвид, че когато се използва двоична сериализация, обектът се запазва изцяло. За да работите с двоична сериализация, трябва да включите System.Runtime.Serialization.Formatters.Binary пространство от имена.

SOAP сериализация

Сериализацията на SOAP (Simple Object Access Protocol) е добър избор, когато искате да прехвърлите обекти от едно приложение в друго, когато тези приложения използват хетерогенни архитектури. По същество основното предимство на използването на SOAP сериализация е преносимостта. SOAP сериализацията може да се използва за сериализиране на обект във формат SOAP. За да работите със сериализация на SOAP, трябва да включите пространството от имена System.Runtime.Serialization.Formatters.Soap във вашата програма. Имайте предвид, че подобно на XML сериализацията, обектите, които са сериализирани чрез SOAP сериализация, се запазват като XML.

XML сериализация

XML сериализацията е вид сериализация, която се използва за сериализиране на публичните членове на екземпляр на клас в XML поток. Имайте предвид, че XML сериализацията е бавна в сравнение с двоичната сериализация - всъщност тя е много по-бавна. Основното предимство на XML сериализацията е, че той осигурява поддръжка на различни платформи и тъй като е базиран на текст, той е четим и може да се редактира също. Можете да се възползвате от XmlAttribute и да го зададете в свойство, за да разрешите на сериализацията на свойството с помощта на XML сериализация. Следният кодов фрагмент илюстрира как можете да използвате XmlAttribute за свойство.

[XmlAttribute("productName")]

public string ProductName

{

  get

  {

    return productName;

  }

  set

  {

    productName = value;

  }

}

За да сериализирате и десериализирате обект, използвайки XML сериализация, можете да използвате XmlSerializer. Следният кодов фрагмент показва как можете да сериализирате обект, като използвате XML сериализация - обърнете внимание как се използва XmlSerializer.

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Product));

using (TextWriter textWriter = new StreamWriter(@"D:\Product.xml"))

 {

    xmlSerializer.Serialize(textWriter, productObject);

 }

Персонализирана сериализация

Можете да използвате персонализирана сериализация, за да контролирате как даден екземпляр от тип може да бъде сериализиран и десериализиран. Можете да внедрите персонализирана сериализация, като внедрите интерфейса ISerializable. Интерфейсът ISerializable декларира метода GetObjectData (). Следният кодов фрагмент илюстрира как можете да внедрите техника за персонализирана сериализация чрез внедряване на интерфейса ISerializable.

[Serializable]

public class Product : ISerializable

{

    public void GetObjectData(SerializationInfo info, StreamingContext context)

    {

        //Usual code

    }

}