3669

Файли і сериалізація об'єктів

Лекция

Информатика, кибернетика и программирование

NET Framework часто виникають дві в загальному випадку схожі завдання: зберегти (прочитати) вміст даних (файлу) і зберегти (прочитати) поточне полягання об'єкту у файлі або в таблиці бази даних. Не дивлячись на безперечну схожість вказаних завдань, в рамках...

Украинкский

2012-11-05

160 KB

3 чел.

Файли і сериалізація об'єктів

У застосуваннях .NET Framework часто виникають дві в загальному випадку схожі завдання: зберегти (прочитати) вміст даних (файлу) і зберегти (прочитати) поточне полягання об'єкту у файлі або в таблиці бази даних. Не дивлячись на безперечну схожість вказаних завдань, в рамках .NET Framework для вирішення кожною з них передбачені свої класи. Класи обробки файлів зосереджені в просторі імен System.IO. Процес збереження поточного стану об'єкту в пам'яті або на носієві інформації називається сериалізацією об'єкту, а зворотний процес — десериалізацією. Ці процеси управляються класами, що знаходяться в просторі імен System.Runtime.Serialization.

Класи для роботи з файловою системою

Робота з файловою системою має на увазі обробку як папок (каталогів), так і зареєстрованих в них файлів. Відповідні класи визначені в просторі імен System. IO.

У табл. 19.1 перераховані класи, що використовуються для роботи з файловою системою.

Таблиця 19.1. Класи для роботи з файловою системою

Клас

Призначення

Directory

Містить статичні методи для створення і використання папок. Ці методи можна викликати без створення відповідних об'єктів

Directorylnf

Містить властивості і методи для створення і використання тек. Доступ до членів класу можливий тільки після створення його екземпляра

File

Містить статичні методи для роботи з файлами. Ці методи можна викликати без створення об'єкту

File info

Містить методи для роботи з класами, які стають доступними після створення об'єкту цього класу

Path

Допоміжний клас для роботи з маршрутами доступу (шляхами)

Статичні класи Directory і File не вимагають створення відповідних об'єктів. Проте при зверненні до їх методів запускається система перевірки безпеки доступу до коду (Code Access System, CAS), що уповільнює роботу цих методів. У зв'язку з цим при обробці декількох папок (файлів) зручніше використовувати класи Directorylnfo і Filelnfо.

У 32-розрядних версіях Windows, як відомо, для передачі даних між різними пристроями (оперативною пам'яттю, дисковою пам'яттю, мережею) використовується концепція потоків даних (stream). Класи для роботи з потоками даних також визначені в просторі імен System.IO і представлені в табл. 19.2.

Таблиця 19.2. Класи для роботи з потоками даних

Клас

Призначення

MemoryStream

Сховище даних в оперативній пам'яті

Networkstream

Дозволяє передавати потік по мережевому з'єднанню

FileStream

Є базовим класом потоку для запису і читання файлів

BinaryReader

Прочитує дані з двійкових файлів

BinaryWriter

Записує дані в двійковий файл

StreamReader

Прочитує дані з текстових файлів

StreamWriter

Записує дані в текстовий файл

Створення і знищення папок

Створення і знищення теки (папки) найпростіше здійснювати методами CreateDirectory () і Delete () класу Directory. Наприклад:

using System.IO;

class Program 

{

static void Main(string[] args)

{

string DirPath = @"c:\C#_proba";    

if (Directory.Exists(DirPath))      

Directory.Delete(DirPath);         

Else  Directory.CreateDirectory(DirPath) ;

}

}

Рядок DirPath може містити вкладені теки. Якщо вони не існують, то при виконанні методу CreateDirectory вони будуть створені.

Метод Delete () видаляє порожню теку. Якщо потрібно знищити також порожні вкладені теки, йому передається параметр true.

Використовувати методи класу Directorylnf для тих же цілей менш зручно:

using System.IO;

class Program 

{

static void Main()

{

DirectoryInfo Dir = new DirectoryInfo(@"c:\C#_proba");

   if (!Dir.Exists()) Dir.Create ();

   else Dir.Delete(true);

}

}

При зверненні до конструктора DirectoryInfo () йому передається маршрут доступу до створюваної теки, але сама тека не створюється. Лише після перевірки факту відсутності теки вона створюється методом Create ().

Перевірка існування теки необхідна, оскільки спроба створити наново існуючу теку або знищити неіснуючу викличе виключення.

При зверненні до методу Delete йому передається логічний параметр, вказуючий на необхідність знищення вкладених тек.

Переміщення і копіювання тек

Для переміщення теки використовується метод Move () класу Directory або метод MoveTo () класу DirectoryInfo. Як параметри першому передаються імена обох тек, а другому — тільки ім'я теки призначення:

Directory.Move("FromMove", "ToMove");

DirectoryInfo Dir = new DirectoryInfo("FromMove");

Dir.Create();

Dir.MoveTo("ToMove");

Фактично, методи Move () і MoveTo () не переміщають теку, а лише перейменовують її, причому обидві теки повинні знаходитися в одному і тому ж розділі одного і того ж диска. Після виконання методу початкова тека зникає, якщо її ім'я відрізняється від імені теки призначення. Методи Move() і MoveTo() зазвичай використовують для додавання вкладених тек в що вже існують. В цьому випадку ім'я теки призначення повторює ім'я початкової теки і розширює її іменами вкладених тек:

Directory.Move("FromMove" @"FromMove\SubFolderl\SubFolder2");

На практиці значно частіше виникає проблема фізичної зміни положення теки, наприклад перенесення її на інший дисковий носій. Для цього необхідно скопіювати вміст початкової теки в теку призначення. Я детально не розглядатиму це загалом нетривіальне завдання. Скажу лише, що вона вирішується рекурсивним викликом деякої процедури, якою передаються імена обох тек. У процедурі є видимим вміст початкової теки, і її файли копіюються в теку призначення. Якщо серед файлів зустрічається вкладена тека, процедура викликає сама себе (це і називається рекурсивним викликом), але вже з іншими іменами теки.

При копіюванні потрібно передбачити можливість відсутності теки призначення, існування в ній копійованого файлу і ін. Оскільки все це виходить за рамки обговорюваної теми, в наступному прикладі можливість такого роду супутніх проблем ігнорується.

Показана в лістингу 18.1 програма  копіює файли з тієї, що однієї поставляється з Visual Studio тек в іншу. У вибраній для копіювання теці відсутні вкладені теки, що виключає необхідність рекурсії. Копійовані файли замінюють однойменні файли, що існують в теці призначення.

Лістинг 19.1. Копіювання теки

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace CopyDir

{

   class Program

   {

       static void Main(string[] args)

       {

string FromDir = @"d:\Program Files\Microsoft Visual Studio 8\ReportViewer";  // Звідки копіюємо

string ToDir = @"d:\ReportViewer\";   // Куди копіюємо

if (!Directory.Exists(ToDir))         // Тека ToDir існує?

Directory.CreateDirectory(ToDir);  // -Нет. Створюємо її

string[] Files;    // Приймач імен файлів - динамічний масив

// Отримуємо всі елементи копійованої теки:

Files = Directory.GetFileSystemEntries(FromDir); // Цикл копіювання:

           for (int k = 0; k < Files.Length; k++)

           {

    // Отримуємо ім'я чергового файлу:

string FromFile = Path.GetFileName(Files[k]);

     // Отримуємо його атрибути:

               FileAttributes FileAttr = File.GetAttributes(Files[k]);

               if ((FileAttr & FileAttributes.Directory) == FileAttributes.Directory)      //Это тека?

                   continue;                                                             // -Да. Пропускаємо її

               Console.WriteLine(FromFile);

               string ToFile = ToDir + FromFile;

               File.Copy(Files[k], ToFile, true);// Копіюємо файл }

               Console.ReadLine();

           }

       }

   }

}

Нагадаю, що практично у всіх сучасних операційних системах (і в Windows зокрема) у файловій системі використовуються так звані таблиці розміщення файлів (File Allocation Tables, FAT). У цих таблицях указуються файли кореневого каталога і вкладені теки верхнього рівня. У FAT кожної вкладеної теки, у свою чергу, указуються файли і вкладені теки. У кожному рядку FAT крім імені файлу (теки) указуються також додаткові відомості: початковий кластер розташування файлу (теки), дата створення і зокрема так звані файлові атрибути, які задаються перерахуванням System. 10. FileAttributes. Значення цього перерахування вказані в табл. 19.3.

Таблиця 19.3. Значення перерахування FileAttributes 

Значення

Опис

Archived

Звичайний файл, доступний для копіювання і видалення

Compressed

Стислий файл

Device

Зарезервовано для майбутнього використання

Directory

Вкладена тека

Encrypted

Файл зашифрований (якщо мова йде про файлі) або всі включені у теку файли зашифровані (якщо мова йде про теці)

Hidden

Прихований файл

Normal

Звичайний файл, для якого не можуть бути встановлені никакие інші атрибути

NotContentlndexed

Файл не може бути індексований службою індексації контексту операційної системи

Offline

Файл не підключений, і його дані в даний час недоступні I

Readonly

Файл, призначений тільки для читання

ReparsePoint

Файл містить крапку репера, тобто блок даних, ассоциированных з іншими файлом або текою

SparseFile

«Рихлий» файл, велика частина якого містить нулі

System

Системний файл, який може використовувати тільки операци-   I онная система

Temporary

Тимчасовий файл I

Елементи перерахувань в С# можуть зв'язуватися з будь-якими цілочисельними константами. Перерахування FileAttributes зв'язується з послідовністю констант 1, 2, 4, 8 і т. д., тобто файловим атрибутом може бути комбінація перерахованих значень. Використовувана в прикладі перевірка блокує обробку будь якої теки:

if ((FileAttr & FileAttributes.Directory) == FileAttributes.Directory) continue;

У вибраній для копіювання теці немає вкладених тек, тому вказана перевірка не потрібна. Але на практиці для копіювання не тільки файлів, але і всіх вкладених тек замість оператора continue слід вставити код, що реалізовує рекурсивний виклик процедури обходу дерева каталогів (тек).

Дослідження інформації про рядок в таблиці FAT

Інформація про одиничний рядок FAT зберігається у властивостях класу FileSystemInfо. В табл. 19.4 перераховані ці властивості.

Таблиця 19.4. Властивості класу FileSystemlnfo 

Властивість

Опис

Attributes

Атрибути

CreationTime

Час створення файлу (теки)

GreationTimeUTC

Час створення у форматі UTC (Universal Time Coordinated

усесвітній скоординований час). Час у форматі UTC відповідає часу по грінвічському меридіану і координується з показаннями атомних годинників

Exists

Ознака існування

Extension

Розширення файлу

FullName

Повне ім'я (з маршрутом доступу)

LastAccess Time

Час останнього звернення до файлу (теці)

LastAccessTimeUTC

Час останнього звернення у форматі UTC

LastWriteTime

Час останньої зміни

LastWriteTimeUTC

Час останньої зміни у форматі UTC

Name

Ім'я файлу (теки)

Класи DirectoryInfo і FileInfo є спадкоємцями базового класу FileSystemInfo і набувають всіх його властивостей.

Лістинг 19.2 ілюструє використання класу DirectoryInfo.

Лістинг 19.2. Використання класу DirectoryInfo

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace DirInfo

{

class Program 

{

static void Main(string[] args)

{

DirectoryInfo DirInfo = new DirectoryInfo(@"c:\Program Files");

   Console.WriteLine("{0,30}1}", "Повне ім'я:",DirInfo.FullName);

   Console . WriteLine (" { 0, 30 } {1} ", "Ім'я : ", DirInfo.Name) ;

   Console.WriteLine("{0,30}1}", "Час створення:",DirInfo.CreationTime);

   Console.WriteLine("{0,30}1}", "Час створення UTC:",DirInfo.CreationTimeUtc);

   Console.WriteLine("{0,30}1}", "Ознака існування:",DirInfo.Exists);

Console.WriteLine("{0,30} {1} ", "Розширення:", DirInfo.Extension);

Console.WriteLine("{0,30}1}", "Час останнього доступу:",DirInfo.LastAccessTime);

Console.WriteLine ("{0,30}1}", "Час останнього оновлення:",DirInfo.LastWriteTime);

   Console.WriteLine("{0,30}1}", "Атрибути:", DirInfo.Attributes);

   Console.ReadLine();

}

}

}

Запис і читання файлів

Техніка роботи з файлами залежить від типу файлу (текстовий або двійковий).

Обробка текстових файлів

При роботі з текстовими файлами спочатку створюється потік класу FileSteram. Дані записуються у файл за допомогою допоміжного об'єкту класу

StraamWriter, а читаються об'єктом класу StreamReader, В лістингу 19.3 показаний приклад роботи з текстовим файлом .

Лістинг 19.3. Робота з текстовим файлом

using System;

using  System.Collections.Generic;

using System.Text;

using System.IO;

namespace StringFileDemo

{

class Program

{

static void Main(string[] ergs)

{

// Запис i текстовий файл:

FileStream Stream = new FileStream("strings.dat",FileMode.Create, FileAccess.Write);

   StreamWriter Writer = new StreamWriter(Stream);

   Writer.WriteLine("Мело, мело по всій Землі");

   Writer.WriteLine("У всі межі.");

   Writer.WriteLine("Свічка горіла на столі.");

   Writer.WriteLine("Свічка горіла...");

   Writer.Close();

   Stream.Close();

   // Читання з файлу:

   Stream = new FileStream("strings.dat",FileMode.Open, FileAccess.Read);

   StreamReader Reader = new StreamReader(Stream);

   string S; do 

   {

   S = Reader.ReadLine();

       if (S != null)

       Console.WriteLine(S);

   }

   while (S != null);

   Reader.Close();

   Stream.Close();

   Console.ReadLine();

}

}

}

При створенні об'єкту FileStream йому передаються ім'я файлу і два параметри: FileMode, що визначає спосіб створення потоку, і FileAccess, регулюючий доступ потоку до даним.

У табл. 19.5 і 19.6 указуються допустимі значення цих параметрів.

Для потоку існує поняття поточного запису — в цей запис поміщаються дані і з неї вони прочитуються.

Положенням поточного запису можна управляти за допомогою методу Seek (), що має таку сигнатуру:

public virtual long Seek(int Offset, SeekOrigin Origin);

Тут Offset — зсув щодо позиції, вказаної параметром Origin. Перерахування SeekOrigin може мати значення, вказане в табл. 18.7.

Таблиця 19.5. Значення параметра FileMode

Значення

Опис

Append

Додає записи в існуючий файл або створює новий. Вимагає, щоб параметр FileMode мав значення Write

Create

Створює новий файл або переписує той, що існує. Вимагає щоб параметр FileMode мав значення Write

CreateNew 

Створює новий файл, а якщо він вже існує, виникає виключення. Вимагає, щоб параметр FileMode мав значення Write 

Open

Відкриває існуючий файл. Якщо файлу немає, виникає виключення

OpenOrCreate

Відкриває той, що існує або створює новий файл, якщо він ще не створений

Truncate

Відкриває існуючий файл і робить його розмір рівним нулю

Таблиця 19.6. Значення параметра FileAccess

Значення

Опис

Read

Потік може читати дані

ReadWrite

Потік може читати і записувати дані

Write

Потік може записувати дані

Таблиця 19.7. Значення перерахування SeekOrigin

Значення

Опис

Begin

Відповідає початку потоку

Current

Відповідає поточному запису потоку

End

Відповідає кінцю потоку

Таким чином, вказаний далі виклик зробить поточним запис з індексом 10 від початку потоку (індексація починається з 0):

Stream.Seek(10, SeekOrigin.Begin);

Фізичний запис даних у файл реалізується у момент закриття потоку методом Close () або виштовхування записів з проміжного буфера методом Flush (). У другому випадку потік не закривається і готовий до продовження операцій.

При читанні рядків з текстового файлу потрібно контролювати кінець файлу. Для цього змінна типу string в С# може приймати значення null, якщо з файлe нічого не прочитано, тобто якщо файл вичерпаний (див. показаний раніше приклад). Іншим способом контролю є звернення до методу StreamReader.Peek(), який повертає позитивне число, якщо файл не вичерпаний, або -1 інакше. Таким чином, цикл читання записів з текстового файлу  спрощується:

while   (Reader.Peek()   >  0) Console.WriteLine(Reader.ReadLine());

Обробка двійкових файлів

Обробка двійкових файлів багато в чому подібна до обробки текстових: спочатку створюється потік, потім — об'єкти BinaryWriter або BinaryReader залежно від напряму передачі даних (у файл або з файлу).

За допомогою методу Write () об'єкту BinaryWrite дані передаються у файл. Метод Write () має безліч переобтяжених варіантів, що дозволяють записувати у файл будь-які дані (зокрема рядки string, так що ділення файлів на рядкових і двійкових носить чисто умовний характер).

Об'єкт BinaryReader має метод Read(), призначений для читання з потоку масиву символів або байтів. Крім того, він має численні методи Read  (ReadBoolean (), ReadByte(), ReadDouble (), ReadString () і т. д.) для читання значень примітивних типів. Його метод PeekChar () дозволяє контролювати кінець файлу: подібно до розглянутого раніше методу Stream-Reader . Peek (), він повертає -1, якщо файл вичерпаний.

Серіалізация

Як вже мовилося на початку цього розділу .NET Framework підтримує цікаву технологію збереження поточного стану об'єкту на деякому носієві інформації. Ця технологія називається сериалізацією об'єкту. Серіалізований об'єкт може бути переданий по мережі на інший комп'ютер і там відновлений в первинному стані — цей процес називається десериалізацією.

Техніка сериализации

Особливістю сериализации є те, що її можна застосовувати тільки до класів, що підтримують цю процедуру. Для цього клас повинен оголошуватися з атрибутом [Serializable] або в його оголошенні повинна бути явна вказівка на те, що він виконує інтерфейс ISerializable. Наприклад:

[Serializable]

Book = class(System.Object)

{

string Title;

string Author;

string Publish;

int Year; }

Лише відносно невелику кількість (менше 40) стандартних CTS-классов реалізують інтерфейс ISsriallzabls. Це, в основному, класи, використовувані як сховища дані (DataSet, DataTabls, TreeNods і деякі інші). У інтерфейсі ISarializabla визначений єдиний метод QetObactDaia такого вигляду:

void GitObjtetData(Strialiiatlonlnfo Info,   StrtamingGontext Centext);

Параметр Info містить дані, a Context — поточний стан потоку даних, На практиці спеціальні класи, що реалізовують інтерфейс ISsrializable, створюються для обслуговування нестандартних типів даних. В більшості випадків цього можна не робити — достатньо лише вставити атрибут [Serializable] перед оголошенням класу, як це зроблено в попередньому прикладі.

При сериалізації середовище CLR створює граф об'єкту і за допомогою цього графа зберігає об'єкт разом з пов'язаними з ним об'єктами. Кожен об'єкт, пов'язаний з основним об'єктом, отримує унікальний ідентифікатор. При десериалізації може зустрітися випадок, коли об'єкт посилається на ідентифікатор ще не відновленого об'єкту. В цьому випадку CLR коректує порядок відновлення об'єктів.

Оголосивши тим або іншим способом, що клас підтримує сериалізацію, ми повинні вибрати формат представлення його об'єкту. Технологія .NET Framework пропонує для цієї мети два формати: двійковий і SOAP (Simple Object Access Protocol — простій протокол доступу до об'єкту). У першому випадку створюється об'єкт класу BinaryFormatter, що належить простору імен System. Runtime. Serialization. Formatters. Binary, в другому — об'єкт класу SoapFormatter, що належить простору імен System.Runtime.Serialization .Formatters.Soap.

Приклад

Описану технологію ілюструє проста програма з лістингу 19.4

Лістинг 19.4. Ілюстрація сериалізація/десериалізація

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

namespace SerialDemo

{

   [Serializable]

   class Book

       /* Обєкти класу Book містять інформацію про книгу.

       Ці об'єкти піддаватимуться сериализации/десериализации. */

   {

       public string Title;     // Назва книги

       public string Author;    // Автор

       public string Publish;  // Видавництво

       public int Ytar;       // Рік випуску

       // Конеяруквор класу!

       public Book(string tit, string aut, string pub, int ytar)

       {

           Title = tit;

           Author = aut;

           Publish = pub;

           Ytar = ytar;

       }

   }

   class Program

   {

       static void Main(string[] arge)

       {

           // Масив для тарах книг:

           Book[] Books = new Book[3];

           // Наповнюємо його:

Books[0] - new Book("C# і платформа .NET", "Троєлсен", "Пітер", 2005);

Books[1] - new Book("ASP.NET. Мистецтво содания веб-сайтів", "Уолтер", "Диа-софт", 2002);

Books[2] - new Book("Грибний цар", "Поляків", "РОСМЕН", 2005);

           // Створюємо потік для сериализации:

FileStream Stream = new FileStream("books.dat", FileMode.Create, FileAccess.Write);

           // Використовуваний двійковий формат:

           BinaryFormatter fmt = new BinaryFormatter();

           fmt.Serialize(Stream, Books);            // Серіалізуєм об'єкти

           Stream.Close();                      // Закриваємо потік

           // Створюємо потік для десериализации:

           Stream = new FileStream("books.dat", FileMode.Open, FileAccess.Read);

           // Створюємо ще одне сховище книг:

           Book[] Bks = new Book[3];

           Bks = (Book[])fmt.Deserialize(Stream);  // Десеріалізуєм

           // Виводимо результат:

           for (int k = 0; k < 3; k++)

           {

               Console.WriteLine("{0,40}, {1, 8}, {2, 8}, {3}", Bks[k].Title, Bks[k].Author, Bks[k].Publish, Bks[k].Year);

           }

           Console.ReadLine();

       }

   }

}

При десериализации виконується явне приведення отримуваного масиву об'єктів до типу Воок[]:

Bks  =   (Воок[])fmt.Deserialize(Stream);

Якщо цього не зробити, компілятор повідомить про несумісність типів Book [ ] і Object: метод Deserialize () завжди повертає дані як об'єкти класу Object.

Якщо якісь члени класу не повинні брати участь в сериаліації/десериалізації, вони позначаються атрибутом [NonSerialized]:

[NonSerialized] public int Year;

Приклад алгоритму запису масиву надано в лістингу 19.5.

Лістинг 19.5. Запис одновимірного масиву на диск.

Добавити клас

using System.IO  

Console.WriteLine("Введіть число ");

int n = Int32.Parse(Console.ReadLine());

StreamWriter wr = new StreamWriter("1.txt");

wr.WriteLine(Int32.Parse(Convert.ToString(n)));

int[] a = new int[n + 2];

Random r = new Random();

 for (int i = 1; i <= n; i++)

           {

a[i] = r.Next(100);

       wr.WriteLine(Int32.Parse(Convert.ToString(a[i])));

               Console.Write(a[i] + " ");

           }

Console.WriteLine();

   wr.Close();

      int[] b = new int[n + 2];

         StreamReader re = new StreamReader("1.txt");

              String word="";

                 word=re.ReadLine();

                  String time="";

 for (int i = 1; i <= Convert.ToUInt32(word); i++)

           {

 time= re.ReadLine();

     b[i] = Convert.ToInt32(time);

       Console.Write("a["+ Convert.ToString(i)+ "]= "+ b[i]+" ");

           }

 Console.ReadLine(); 


 

А также другие работы, которые могут Вас заинтересовать

72535. ВОЗМОЖНОСТИ ПОВЫШЕНИЯ ЭФФЕКТИВНОСТИ ЛОГИСТИЧЕСКИХ СИСТЕМ 1.52 MB
  Но замедление скорости движения материальных товарных и финансовых потоков в логистической системе предприятия неминуемо приводит к уменьшению объема выпуска и реализации продукции снижению ее рентабельности при наличии авансированных ресурсов в неизменных размерах.
72536. Ценообразование в условиях монополии и олигополии 154.5 KB
  Поэтому кривая спроса на его продукцию относительно стабильна а цены на товары ограничены лишь покупательской оценкой их полезности относительно дохода и общим состоянием рыночной конъюнктуры. Например если фирма монополизирующая рынок упаковочных материалов установит на них неприемлемо...
72537. ФИНАНСОВЫЕ РИСКИ В ЛОГИСТИЧЕСКИХ СИСТЕМАХ И СПОСОБЫ ИХ СНИЖЕНИЯ 363 KB
  На риски продавца связанные с оплатой по контракту и на риски покупателя связанные с доставкой товара существенно влияют установленные в контракте условия платежа. При этом регламентируются расходы по кредиту и платежам а также устанавливаются форма и путь оплаты.
72540. ИСТОРИЯ РАЗВИТИЯ, ПОНЯТИЕ И СОДЕРЖАНИЕ ПРЕСТУПНОГО ФЕНОМЕНА «ВОРЫ» В МЕСТАХ ЛИШЕНИЯ СВОБОДЫ РОССИИ 250.5 KB
  Потребность в изучении истории возникновения и развития преступного феномена «воры» обусловлена необходимостью познания сущностных корней этого социального явления, определения первопричин его бытия. Установление факторов, лежащих в основе этого явления, дает нам возможность его объективной оценки...
72541. КОНСТИТУЦИОННО-ПРАВОВОЙ СТАТУС МЕЖГОСУДАРСТВЕННОГО СОЮЗА РОССИИ И БЕЛОРУССИИ 295.5 KB
  Отражением высокой степени российско-белорусской интеграции является Договор между Российской Федерацией и Республикой Беларусь от 8 декабря 1999 года О создании союзного государства согласно которому государства-участники создают Союзное государство знаменующее собой новый этап в процессе...
72542. СССР КАК ФОРМА МЕЖГОСУДАРСТВЕННОГО ОБЪЕДИНЕНИЯ СУВЕРЕННЫХ ГОСУДАРСТВ 237.5 KB
  Союз ССР был образован четырьмя советскими республиками РСФСР УССР БССР ЗСФСР возникшими в разное время и поразному и ставшими первыми его членами. Якубовская поддерживает идею существования договорной федерации до образования СССР которая в дальнейшем была преобразована в юридически...
72543. МОРАЛЬНЫЙ ВРЕД В РОССИЙСКОМ ЗАКОНОДАТЕЛЬСТВЕ И ЕГО РЕГУЛИРОВАНИЕ КОНСТИТУЦИЕЙ РОССИИ 143.5 KB
  Институт компенсации морального вреда один из основных способов защиты неимущественных прав человека. Сама идея возмещения морального вреда прослеживается уже в римском праве. Категория морального вреда в российском законодательстве появилась сравнительно недавно.