Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ПИ Программирование на С# _Хотов.docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
2.22 Mб
Скачать
      1. Сериализация в формат soap. SoapFormatter

Протокол SOAP (Simple Object Access Protocol) представляет простой протокол для обмена данными между различными платформами. При такой сериализации данные упакуются в конверт SOAP, данные в котором имеют вид xml-подобного документа. Посмотрим на примере.

Прежде чем использовать класс SoapFormatter, нам надо добавить в проект сборкуSystem.Runtime.Serialization.Formatters.Soap.dll. После этого нам станет доступным функциональность SoapFormatter:

using System;

using System.IO;

using System.Runtime.Serialization.Formatters.Soap;

namespace Serialization

{

[Serializable]

class Person

{

public string Name { get; set; }

public int Age { get; set; }

public Person(string name, int age)

{

Name = name;

Age = age;

}

}

class Program

{

static void Main(string[] args)

{

Person person = new Person("Tom", 29);

Person person2 = new Person("Bill", 25);

Person[] people = new Person[] { person, person2 };

// создаем объект SoapFormatter

SoapFormatter formatter = new SoapFormatter();

// получаем поток, куда будем записывать сериализованный объект

using (FileStream fs = new FileStream("people.soap", FileMode.OpenOrCreate))

{

formatter.Serialize(fs, people);

Console.WriteLine("Объект сериализован");

}

// десериализация

using (FileStream fs = new FileStream("people.soap", FileMode.OpenOrCreate))

{

Person[] newPeople = (Person[])formatter.Deserialize(fs);

Console.WriteLine("Объект десериализован");

foreach (Person p in newPeople)

{

Console.WriteLine("Имя: {0} --- Возраст: {1}", p.Name, p.Age);

}

}

Console.ReadLine();

}

}

}

Принцип использования SoapFormatter похож на рассмотренную в прошлой теме бинарную сериализацию. Здесь также создается поток, записывающий данные в файл people.soap. Для сериализации используется метод formatter.Serialize(fs, people), использующий поток и объект для сериализации.

При десериализации считываем ранее сохраненные объекты и преобразуем их к нужному нам объекту в методе Deserialize:Person[] newPeople = (Person[])formatter.Deserialize(fs)

После сериализации все данные будут сохранены в файл people.soap, который будет иметь следующее содержание:

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Body>

<SOAP-ENC:Array SOAP-ENC:arrayType="a1:Person[2]" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/Serialization%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">

<item href="#ref-3"/>

<item href="#ref-4"/>

</SOAP-ENC:Array>

<a1:Person id="ref-3" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/Serialization%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">

<_x003C_Name_x003E_k__BackingField id="ref-5">Tom</_x003C_Name_x003E_k__BackingField>

<_x003C_Age_x003E_k__BackingField>29</_x003C_Age_x003E_k__BackingField>

</a1:Person>

<a1:Person id="ref-4" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/Serialization%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">

<_x003C_Name_x003E_k__BackingField id="ref-6">Bill</_x003C_Name_x003E_k__BackingField>

<_x003C_Age_x003E_k__BackingField>25</_x003C_Age_x003E_k__BackingField>

</a1:Person>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>