Приложения будущего. Обзор платформы .NET. Волшебство метаданных.
Даже если бы платформа .NET смогла устранить все проблемы прошлого, этого все равно было бы недостаточно. Постоянный рост требований со стороны клиентов к функциональным возможностям приложений является одним из непреложных законов программирования.
Возможность беспрепятственной работы приложений в разных компьютерных сетях, обусловленная развитием Internet, стала императивом. Функциональные возможности компонентов должны быть доступны также и с других машин. При этом никто из программистов не хочет писать базовый каркас; все они жаждут писать приложения, предназначенные для непосредственного решения проблем своих клиентов.
Обзор платформы .NET
Платформа .NET содержит общеязыковую среду выполнения (Common Language Runtime – CLR). Общеязыковая среда выполнения CLR поддерживает управляемое выполнение, которое характеризуется рядом преимуществ. Совместно с общей системой типов (Common Type System – CTS) общеязыковая среда выполнения CLR поддерживает возможность взаимодействия языков платформы .NET. Кроме того, платформа .NET предоставляет большую полнофункциональную библиотеку классов .NET Framework.
Волшебство метаданных
Чтобы решить все проблемы, связанные с разработкой Windows-приложений, платформа .NET должна обладать базовым набором служб, которые в любой момент доступны в любом языке программирования. Чтобы предоставить такие службы, платформа .NET должна иметь достаточно сведений о приложении.
Сериализация (преобразование в последовательную форму) объекта может послужить в качестве простого примера. Перед каждым программистом, рано или поздно, возникает проблема сохранения данных. Но зачем каждому программисту вновь изобретать колесо, решая вопрос о том, как следует сохранять вложенные объекты и сложные структуры данных? Зачем каждому программисту понимать, как эти объекты и данные хранятся в разных информационных хранилищах? Платформа .NET позволяет выполнить сериализацию объекта без вмешательства программиста. При желании разработчик может это сделать и самостоятельно.
Чтобы понять, как происходит сериализация объектов, мы рассмотрим относящийся к данной главе пример Serialize (Сериализация). Не станем акцентировать внимание на применяемых приемах программирования. Они будут рассмотрены позже. Сейчас же мы сосредоточимся на используемых в этом примере понятиях.
//Serialize.cs >fusing <mscorlib.dll> >fusing <System.Runtime.Serialization.Formatters.Soap.dll> >// <Система. Время выполнения. >// Преобразование в последовательную форму. Форматеры. Soap.dll> >using namespace System; >// использование пространства имен Система; >using namespace System::Collections; >// использование пространства имен Система:: Коллекции; >using namespace System::10; >// использование пространства имен Система:: Ввод-вывод; >using namespace >System::Runtime:Serialization::Formatters::Soap; // использование пространства имен >// Система:: Время выполнения:: Преобразование в последовательную // форму:: Форматеры:: Soap; >[Serializable] >// [Преобразование в последовательную форму] >_gc class Customer >// класс сборщика мусора Клиент >{ >public: >String *pname; // Строка long id; // идентификатор >}; >_gc class Test >// класс сборщика мусора Испытание >{ >public: >static void Main() >{ >ArrayList *plist = new ArrayList; >Customer *pcust = new Customer; // новый Клиент pcust › pname = "Charles Darwin"; // Чарльз Дарвин pcust › id = 10; // идентификатор plist › Add(pcust); // Добавить >pcust = new Customer; // новый Клиент pcust › pname = "Isaac Newton"; // Исаак Ньютон pcust › id =20; // идентификатор plist › Add(pcust); // Добавить >for (int i=0; i < plist › get_Count(); i++) >{ >Customer *pcust = // Клиент >dynamic_cast<Customer _gc *> // <Клиент _ сборщик >//мусора *> (plist › get_Item(i)); Console::WriteLine("{0}: {!}", >pcust › pname, _box(pcust › id)); // идентификатор } ~ >Console::WriteLine("Saving Customer List"); // ("Сохранение списка клиентов"); FileStream *ps = new FileStream(>"cust.txt", FileMode::Create); // Создать SoapFormatter *pf = new SoapFormatter; pf › Serialize(ps, plist); >// Преобразование в последовательную форму; ps › Close (); >Console::WriteLine("Restoring to New List"); >// "Восстановить в новом списке"); >ps = new FileStream("cust.txt", FileMode::Open); // Открыть >pf = new SoapFormatter(); >ArrayList *plist2 = >dynamic_cast<ArrayList *> >(pf › Deserialize(ps)); ps › Close(); >for (int i=0; i < plist › get_Count(); i++) { >Customer *pcust = // Клиент >dynamic_cast<Customer _gc *> // <Клиент _ сборщик мусора *> >(plist › get_Item(i)); Console::WriteLine("{0}: {!}", >pcust › pname, _box(pcust › id)); // идентификатор } } }; >void main(void) { >Test::Main(); }