Программирование >>  Программирование с использованием ajax 

1 ... 249 250 251 [ 252 ] 253 254 255 ... 396


Код начинается с создания объекта FileStream и затем использует его для создания объекта GZipStream. Обратите внимание, что в приведенном коде все вхождения GZipStream можно было бы заменить Def alateStream - эти классы работают одинаково. Перечисление CompressionMode. Compress используется для специфицирования того, что данные должны быть сжаты. После этого применяется StreamWriter для записи данных в файл.

Метод LoadCompressedFile () -зеркальное отображение метода SaveCompressedFile (). Вместо сохранения в файл с заданным именем, он загружает сжатый файл в строку:

static string LoadCompressedFile(string filename)

FileStream fileStream =

new FileStream(filename, FileMode.Open, FileAccess.Read); GZipStream compressionStream =

new GZipStream(fileStream, CompressionMode.Decompress); StreamReader reader = new StreamReader(compressionStream); string data = reader.ReadToEnd(); reader.Close(); return data;

Отличие состоит в том, чего и следовало ожидать - в разных значениях перечислений FileMode, FileAccess и CompressionMode для загрузки и распаковки данных, а также использовании StreamReader для получения распакованного текста из файла.

Код в Main () - просто тест для этих методов. Он просто запрашивает строку, дублирует ее 100 раз, чтобы сделать все интереснее, сжимает в файл, а затем извлекает все это оттуда. В рассмотренном примере начальная строфа из Рыцарей круглого стола , повторенная 100 раз, имеет длину в 17 800 символов, но в сжатом виде состоит всего лишь из 441 байт, что составляет степень сжатия 40:1. Правда, здесь присутствует элемент мошенничества - известно, что алгоритм GZIP особенно эффективно работает с повторяющимися данными, однако это иллюстрирует сжатие в действии.

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

Сериализованные объекты

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

.NET Framework представляет инфраструктуру для сериализации объектов в пространствах имен System.Runtime.Serialization и System.Runtime.Srialization. Formatters, со специфическими классами, реализующими эту инфраструктуру в пространствах имен, которые вложены в упомянутые два. Доступны две реализации:

□ System.Runtime.Serialization.Formatters.Binary - это пространство имен содержит класс BinaryFormatter, который способен сериализовать объекты в двоичные данные и обратно;

□ System.Runtime. Serialization. Formatters . Soap - это пространство имен содержит класс SoapFormatter, который способен сериализовать объекты в SOAP-формат XML-данных и наоборот.



В этой главе рассматривается только BinaryFormatter, потому что вы еще не изучали XML-данные. Однако поскольку эти классы реализуют интерфейс IFormatter, большая часть последующего обсуждения касается обоих классов.

Интерфейс IFormatter предоставляет методы, перечисленные в табл. 24.9.

Таблица 24.9. Методы интерфейса iFormatter

Метод

Описание

void Serialize(Stream stream.

Сериализует объект source в поток stream

object source)

object Deserialize(Stream stream)

Десериализует данные в stream и возвращает

результирующий объект

, Важным и удобным для этой главы является то, что эти методы работают с потоками. Это облегчает их подключение к механизмам доступа к файлам, уже показанным в этой главе - вы можете легко использовать объекты FileStream. Сериализация с применением BinaryFormatter проста:

IFormatter serializer = new BinaryFormatter(); serializer .Serialize (inyStrea/n, myObject) ;

Десериализация не сложнее:

IFormatter serializer = new BinaryFormatter();

MyObjectType myNewObject = serializer. Deserialize (/nyStrea/n) as MyObjectType;

Очевидно, что нужны потоки и объекты, с которыми можно работать, но приведенный выше синтаксис подходит к большинству случаев. Следующее практическое занятие демонстрирует, как это реально работает.

пу1сшческоеэа1 т11е Сериализация объектов

1. Создайте новое консольное приложение по имени ObjectStore и сохраните его в каталоге С: \BegVCSharp\Chapter24.

2. Добавьте к проекту новый класс по имени Product и модифицируйте код следующим образом:

namespace ObjectStore {

public class Product {

public long Id; public string Name; public double Price;

[NonSerialized]

string Notes;

public Product(long id, string name, double price, string notes) {

Id = id; Name = name; Price = price; Notes = notes;



public override string ToStringO {

return string.Format ( {0} : {1} (${2:F2}) {3} , Id, Name, Price, Notes);

3. Поместите следующие строки кода в начало Program, cs. Вам нужно импортировать пространство имен System. 10 для работы с файлами, и другие пространства имен - для сериализации:

using System;

using System.Collections.Generic; using System.Linq; using System.Text; using System.10;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

4. Добавьте следующий код в метод Main () в Program, cs:

static void Main(string [ ] args) {

Создать продукт.

List<Product> products = new List<Product> () ;

products.Add(new Product (1, Spiky Pung , 1000.0, Good stuff. )) ; products.Add(new Product (2, Gloop Galloop Soup , 25.0, Tasty. )); products.Add(new Product (4, Hat Sauce , 12.0, One for the kids. ));

Console.WriteLine( Products to save: );

Console.WriteLine( Продукты для сохранения: );

foreach (Product product in products) {

Console.WriteLine(product);

Console.WriteLine 0 ;

Получить сериализатор.

IFormatter serializer = new BinaryFormatter();

Сериализовать продукты. FileStream saveFile =

new FileStream( Products.bin , FileMode.Create, FileAccess.Write); serializer.Serialize(saveFile, products); saveFile.Close() ;

Десериализовать продукты. FileStream loadFile =

new FileStream( Products.bin , FileMode.Open, FileAccess.Read) ; List<Product> savedProducts =

serializer.Deserialize (loadFile) as List<Product>; loadFile.Close 0;

Console.WriteLine( Products loaded: );

Console.WriteLine( Загруженные продукты: );

foreach (Product product in savedProducts) {

Console.WriteLine(product);



1 ... 249 250 251 [ 252 ] 253 254 255 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика