Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

C+Sharp+and+.NET [CSharp & .NET] 2001.08.29


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

C Sharp and Dot NET

Содержание

  • 1. О рассылке
  • 2. Сериализация (Serialization)
    • 2.1. Обзор
    • 2.2. Пример
    • 2.3. Классы, участвующие в работе
    • 2.4. Особенное сохранение
  • 3. Вопросы
    • 3.1. Доступ в RDBMS через механизм сериализации
  • 4. Письма
    • 4.1. Что нужно для работы с C#
    • 4.2. Microsoft .NET Framework (у меня - v1.0.2914)
    • 4.3. Microsoft .NET Framework SDK
    • 4.4. Microsoft Visual Studio .NET

1. О рассылке

Данная рассылка задумывается как аналог премодерируемой конференции.
Здесь мы, люди изучающие и использующие платформу .NET, сможем обменяться своими находками и идеями.
Присылайте ваши стать и вопросы на адрес level3@mail.ru. Они будут помещены в рассылку с указанием имени и (по желанию) адреса автора.
На письма с очень часто задаваемыми вопросами я постараюсь ответить, не помещая их в рассылку. Таким образом, надеюсь, что материалы будут интересными для Вас.

[к содержанию]

2. Сериализация (Serialization)

2.1. Обзор

Сериализация - это процесс преобразования графа объектов в последовательность байтов. Полученная последовательность байтов может быть перенесена через пространство и/или время и восстановлена обратно (Deserialization) в граф объектов.

В CLR поддержка сериализации производиться классами из пространства имен System.Serialization и средой выполнения (runtime system)

Компилятору и среде выполнения известно, где находятся данные объекта. Это позволяет написать обобщенную библиотеку для сохранения любых (ну почти) объектов и тогда становится не нужно писать в каждом объекте код для сохранения данных объекта.

При сериализации система поддержки решает следующие задачи:
1) преобразование ссылок на объекты во что-либо, т.к. ссылки - это адреса расположения объектов в памяти и они не имеют смысла в другом контексте. Т.е. при следующем запуске программы объекты будут располагаться в памяти по-другому и их адреса будут другими.
Можно пронумеровать все объекты, которые будут сохранены и записывать вместо адресов полученные номера.
2) следить за сохранением "неповторимости" ;) объекта
Порядок, в котором будут пронумерованы объекты, не имеет значения. Важно, чтобы номера были уникальными.
Алгоритму, который обрабатывает объекты по одному, требуется способ определять, какие объекты были пронумерованы, а какие нет. Для этого алгоритм может поддерживать внутренний список. Если же не запоминать, какие объекты были сохранены, а какие - нет, то может получиться так, что один объект будет сохранен два раза. При считывании это приведет к тому, что вместо одного исходного объекта будет создано два.

Есть два способа записывать объекты.
В одном случае все данные объекта располагаются близко друг к другу, в другом объект вписывается внутрь сославшегося на него объекта вместо ссылки.
В .NET выбран первый.

Выходной поток может быть представлен в двоичном виде и в виде XML (SOAP).

Можно написать свой класс, который будет форматировать выходной поток так, как нужно (например, в текстовом виде. А можно сохранить в XML-виде и затем преобразовать в текст).

[к содержанию]

2.2. Пример

using System;
using System.IO;
using System.Collections;
using System.Serialization;
using System.Serialization.Formatters.Binary;

class SerializeExample
{
    public static void Main(String[] args)
    {
        // create the object graph
        ArrayList l = new ArrayList();
        for (int x=0; x< 100; x++)
        {
            l.Add (x);
        }
        // create the filestream
        FileStream s = File.Create("foo.bin");
        // create the BinaryFormatter
        BinaryFormatter b = new BinaryFormatter();
        // serialize the graph to the stream
        b.Serialize(s, l);
    } // end main
} // end class

class DeSerialize
{
    public static void Main(String[] args)
    {
        // open the filestream
        FileStream s = File.Open("foo.bin");
        // create the formatter
        BinaryFormatter b = new BinaryFormatter();
        // deserialize
        ArrayList p = (ArrayList) b.Deserialize(s);
        // use the new object graph
        Console.WriteLine(p.ToString());
    } // end Main
} // end Class DeSerialize

В качестве потоков можно использовать FileStream, MemoryStream и NetStream.

[к содержанию]

2.3. Классы, участвующие в работе

Formatter
Отвечает за запись данных объекта в некотором формате в выходной поток. Этот же класс считывает данные обратно.
public interface IFormatter:
{
    // Properties
    SerializationBinder Binder { get; set; }
    StreamingContext Context { get; set; }
    ISurrogateSelector SurrogateSelector { get; set; }
    //Methods
    object Deserialize(Stream serializationStream);
    void Serialize(Stream serializationStream, object graph);
}
ObjectIDGenerator
Присваивает объектам идентификаторы. Он же следит за тем, чтобы объект не был сохранен два раза, поэтому знает, когда нужно присваивать объекту новый идентификатор, а когда возвращать запомненный.
ObjectManager
Следит за объектами, создаваемыми во время восстановления графа. Он для каждой ссылки, считанной из потока, может сказать, был создан соответствующий объект или нет.

При необходимости можно написать специальную версию любого из этих объектов. Например специальный Formatter может приписывать заголовок файла. (для чего еще)?
Это может быть нужно например в тех случаях, когда часть полей вычисляется. (хотя почему бы их тоже не записать и потом считать?)

Интересно заметить, что в общем случае значения полей объекта узнаются при помощи Reflection, а оно не гарантирует, что значения полей объекта будут возвращаться в том порядке, в котором хранятся метаданные о них.

Для того, чтобы система сохраняла объект, его класс должен быть помечен атрибутом [Serializable]
Атрибут [NotSerialized] является аналогом ключевому слову transient из java.

2.4. Особенное сохранение

Если некоторый объект должен сохраняться не как все, то нужно реализовать интерфейс ISerializable.

В этом интерфейсе есть две функции - GetObjectData и конструктор.
Функция GetObjectData в момент сохранения объекта должна заполнить объект SerializationInfo. SerializationInfo хранит тип сохраняемого объекта и массив пар "имя поля" - "значение".
Далее SerializationInfo передается в объект класса Formatter

При восстановлении объекта из потока конструктор не будет вызван до тех пор, пока не будут собраны все необходимые данные (т.е. значения полей и ссылок на другие объекты). Однако не дается гарантии, что соседние объекты проинициализированы (т.е. нельзя вызывать из методы). Это почти очевидно, достаточно представить себе сохранение и восстановление кольца (цикла) из объектов.

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

[к содержанию]

3. Вопросы

3.1. Доступ в RDBMS через механизм сериализации

Если реализовывать Object->Relational bridge, то можно ли воспользоваться имеющимся механизмом сериализации написав свой formatter?
Понятно, что в общем случае - нет, т.к. тогда придется сохранять весь граф объектов целиком. А если реализовывать bridge с нуля, но можно сохранять/считывать только нужные объекты, а вместо несчитанных вставлять заглушки.

[к содержанию]

4. Письма

4.1. Что нужно для работы с C#

-----Original Message-----
Sent: Friday, August 31, 2001 3:19 PM
To: level3@mail.ru
Subject: Вопрос ?

Сергей, добрый день!
С интересом стал читать Вашу рассылку.
Но есть один маленький вопрос:
 - Что необходимо для выполнения программы на С#, т.е. потребуется ли
дополнительная среда разработки (типа VC++) или можно обойтись текстовым
редактором?
С уважением и наилучшими пожеланиями,
Алексей К.
---------
Алексей,

можно обойтись текстовым редактором и Framework'ом (~20Mb в архиве), но лучше добыть VS.NET Beta2 на пяти дисках (professional версия распространяется на пяти компакт-дисках, но один из дисков - патчи к операционным системам).

В Visual Studio очень удобный редактор, который специально предназначен для работы с текстом на C# (он умеет сворачивать текст, чего мне очень не хватало в JBuilder 3.5), кроме того, там есть редактор форм, многочисленные заготовки, справка, в конце концов.

Удачи!

[к содержанию]

4.2. Microsoft .NET Framework (у меня - v1.0.2914)

(лежит в %windir%\Microsoft.NET\Framework)

Итак: для выполнения программы на C# требуется Microsoft .NET Framework.
Это пакет включает в себя .dll-файлы, в которых содержаться различные стандартные модули а так же компиляторы.

Утилиты, входящие в состав Framework:

al.exe
Создает сборку (Assembly) из нескольких файлов с MSIL-кодом и ресурсов
aspnet_regiis.exe
aspnet_state.exe
aspnet_wp.exe
Позволяют использовать несколько версий ASP.NET на одной машине
CasPol
Позволяет управлять правами доступа для кода
Copy2Gac.exe
Copy to global assembly cache - интуитивно понятно, но описания я к ней не нашел (кроме того, которое выдается при запуске с ключем -?).
csc.exe
Компилятор с языка C#
cvtres.exe
???
IEExec.exe
???
ilasm.exe
Ассемблер, на вход подается программа на MSIL, на выходе получается .exe-файл
installutil.exe
вызывает код регистрации и разрегистрации для сборки
jsc.exe
компилятор языка JScript.NET
mscorcfg.exe
???
ngen.exe
???
RegAsm.exe
Регистрирует сборку как набор COM-объектов
RegSvcs.exe
Регистрирует сборку как набор COM+ сервисов
shfusion.dll
дополнение к explorer, которое позволяет просматривать содержимое кеша сборок. (сборки компилируются из MSIL в машинный код и хранятся в откомпилированном виде в кеше)
vbc.exe
компилятор VisualBasic.NET

[к содержанию]

4.3. Microsoft .NET Framework SDK

(лежит в %Program Files%\Microsoft.NET\FrameworkSDK)

Еще бывает Microsoft Framework SDK. Framework SDK не установится, если версия Explorer'а < 6.0, поэтому он при установке сначала предложит обновить Explorer.

AxImp.exe
Делает обертку (wrapper) для элемента ActiveX. После этого можно использовать такой элемент управления на Windows-формах
gacutil.exe
позволяет управлять содержимым кеша
ResGen.exe
???
signcode.exe
Подписывает .exe-файл, чтобы можно было убедиться в том, что файл не изменен и принадлежит тому, кто его подписывал
sn.exe
Создает сборки с общими именами (Creates and verifies assemblies with shared names)
TlbExp.exe
Для некоторой сборки создает .tlb-шку
TlbImp.exe
Для некоторой .tlb-шки создает набор описывающий ее метаданных
wsdl.exe
??? используется при программировании на ASP
xsd.exe
Используется для редактирования XML-Schema'ов

[к содержанию]

4.4. Microsoft Visual Studio .NET

Включает в себя IDE, CrystalReports.NET, Platform SDK и MSDN.NET

К сожалению, у меня здесь MSDN за апрель 2001, поэтому много чего не хватает. Если я чего не заметил, напишите.

[к содержанию]


Буду рад услышать о других практических применениях упомянутых и неупомянутых классов - пишите на адрес level3@mail.ru

С уважением и наилучшими пожеланиями,
Сергей Радкевич.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное