sonyps4.ru

Метаданные в. Отрывок, характеризующий Метаданные в.NET

Существует множество баз данных. Чтобы понять, что они собой представляют, необходимо рассматривать их содержимое. Но есть одна маленькая полезная деталь - метаданные. Это то, что обобщает всю имеющуюся информацию. Для чего они были разработаны и зачем используются?

Что такое метаданные?

Следует отметить, что единой формулировки данного понятия не существует. Итак, метаданные - это общее название информации о

В основном используется четыре обозначения данного термина:

  1. Могут подразумевать субканальную информацию про используемые данные.
  2. Так называют характеристики, описывающие сущность. Они необходимы, чтобы искать, идентифицировать, оценивать и управлять значениями в БД. Ещё таким образом называют важный набор определённого количества структурированных описаний, предоставленных в допустимой форме и доступных в явном виде, благодаря чему можно найти необходимый объект. Подобная формулировка применяется в случаях, когда необходимо искать сущности, ресурсы и объекты.
  3. Данные из общей формальной системы, которые описывают свойства конкретного хранилища информации.
  4. Информация про характеристики веб-страницы (когда была создана, кто её автор).

Различие между данными и метаданными

Как их отличают? Дело в том, что провести однозначное разделение обычно невозможно. Почему? Давайте рассмотрим более детально на примере:

  1. Что-то может выступать в обеих ролях. Например, заголовок статьи может рассматриваться и как элемент метаданных, и в качестве информации, что передаётся читателю.
  2. Возможность меняться местами. Допустим, кто-то написал стихотворное произведение. Оно представляет собой данные. Композитор, опираясь на слова, создал музыкальную композицию и прикрепил данный текст. В таком случае он превращается в метаданные. Всё зависит от использования. Вообще, подобные случаи возможны из-за восприятия определённой точки зрения на основании своих суждений (тут играет роль пространство имён и система отсчёта).
  3. Возможность создания мета-…-метаданных ориентируясь на аксиому выбора. Это вытекает из того, что почти на любую информацию может быть создана своя система характеристик.

Метаданные файлов в компьютерах

Своё применение они нашли и в автоматизированных рабочих потоках. Если какая-то программа умеет работать с содержимым и то они могут быть преобразованы в другой тип информации, что позволяет освобождать пользователей от множества неудобных и рутинных действий.

Примером могут служить разработки, которые позволяют просматривать графические изображения с разными расширениями. Также можно вспомнить и о различных записях звука, фильмов и многих других вещах.

Метаданные в мировой сети

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

Классификация метаданных

Как их различают? В основном классификация проводится по одному из двух принципов:

  1. Содержание. Метаданные используются, чтобы описывать файл, ресурс или его содержимое (к примеру, заголовок - «как готовить картошку»).
  2. По принадлежности. Метаданные могу использовать, чтобы информировать о чем-то целом или его составляющей. Так, название фильма относится ко всему нему, а описание эпизода информирует только об определенной части.

Если метаданные - это совокупность зависимостей от возможностей логического вывода, то в таком случае они делятся на 3 вида:

  1. «Сырые» данные. Основа информационного обеспечения.
  2. Метаданные, описывающие содержимое. Они, в свою очередь, тоже используются.
  3. Метаданные, с помощью которых можно сделать логический вывод.

Такие типы метаданных существуют.

Три наиболее востребованных класса

Предлагаем ознакомиться с тремя классами, которые сейчас широко применяются:

  1. Внутренние метаданные. Это информация, которая описывает составные части вещей, их структуру и что она собой представляет. В качестве примера можно привести размер и формат файла.
  2. Административные метаданные. Требуются для процессов обработки информации, а также для назначения вещи. Например, кто автор, редактор, когда был создан файл.
  3. Описательные метаданные. Используются, чтобы охарактеризовать природу файла и его признаки (к какой категории относится, с чем ещё связан).

Формат метаданных

Так называют стандарт, который используется, чтобы проводить формальное описание какой-то категории ресурсов (сущностей, объектов и тому подобного).

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

Возможные проблемы

Когда может возникать ошибка метаданных? Отсутствие необходимой информации или ограничение доступа - вот основные причины возникающих проблем.

Также ошибка загрузки метаданных появляется в тех случаях, когда файл есть, но он повреждён. Основных причин такого состояния насчитывают три: износ техники, вредоносное влияние отдельных программ (как правило, компьютерных вирусов) и неправильное завершение работы с документом, по причине чего данные сохранились некорректно.

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

using System; using System.Reflection; using System.Text; using System.CodeDom.Compiler; using Microsoft.CSharp; namespace DynUnloop { // Проверка в цикле class SearchLooping { public int Search(int a, int b) { int count = 0; foreach (int i in b) { foreach (int j in a) { if (i == j) { count++; break ; } } } return count; } } // Проверка cгенерированным switch"ом public interface IChecker { bool Check(int valMax); } class SearchFlat { IChecker WriteCode(int a) { StringBuilder code = new StringBuilder(); code.Append("\n namespace DynUnloop" ); code.Append("\n { class Checker: IChecker" ); code.Append("\n { bool IChecker.Check(int n)" ); code.Append("\n { switch (n)" ); code.Append("\n {" ); foreach (int j in a) code.Append("\n case " + j + ":" ); code.Append("\n return true;" ); code.Append("\n }" ); code.Append("\n return false;" ); code.Append("\n } } }\n" ); //Console.Write(code.ToString()); // проверяем сгенерированный код CSharpCodeProvider cs = new CSharpCodeProvider(); ICodeCompiler csc = cs.CreateCompiler(); CompilerParameters pars = new CompilerParameters(); pars.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location); CompilerResults result = csc.CompileAssemblyFromSource(pars, code.ToString()); // компилируем! if (result.Errors.Count != 0) { foreach (CompilerError err in result.Errors) Console.WriteLine(err.ToString()); return null ; } Assembly asm = Assembly.LoadFrom(result.PathToAssembly); return (IChecker)asm.CreateInstance("DynUnloop.Checker" ); } public int Search(int arr1, int arr2) { if (this .code == null ) this .code = WriteCode(arr1); int result = 0; foreach (int i in arr2) { if (this .code.Check(i)) // используем сгенерированный код result++; } return result; } IChecker code = null ; } class Test { static void Main(string args) { int a = { // Подсчитываем вхождения этих чисел в масссив arr2. 74, 97, 93, 86, 2, 78, 48, 14, 21, 58, 60, 5, 39, 4, 66, 9 , 31, 15, 69, 27, 37, 46, 62, 61, 81, 17, 88, 19, 44, 8 }; int b = { // В этом массиве ищем числа из, содержащиеся в arr1. 98, 53, 79, 47, 0, 39, 28, 18, 39, 49, 56, 17, 33, 19, 72, 13 , 28, 48, 21, 80, 10, 3, 67, 76, 83, 6, 40, 58, 23, 74, 81, 88 , 13, 48, 59, 83, 47, 1, 38, 63, 70, 21, 23, 30, 86, 71, 15, 25 , 32, 73, 23, 55, 52, 19, 90, 95, 84, 2, 63, 93, 98, 69, 93, 64 , 66, 66, 3, 84, 58, 88, 64, 26, 9, 56, 9, 88, 78, 37, 88, 11 , 89, 14, 26, 49, 50, 26, 36, 93, 56, 63, 97, 44, 37, 44, 64, 1 , 26, 58, 62, 19, 68, 30, 66, 42, 9, 96, 45, 94, 9, 2, 17, 46 , 12, 51, 3, 83, 43, 44, 14, 40, 30, 9, 27, 94, 90, 19, 87, 64 , 91, 8, 61, 20, 74, 69, 42, 59, 47, 82, 40, 52, 80, 41, 83, 54 , 45, 50, 31, 85, 41, 80, 56, 80, 44, 22, 88, 58, 3, 70, 51, 88 , 8, 80, 2, 1, 39, 96, 71, 42, 8, 43, 35, 59, 4, 60, 59, 88 , 25, 72, 48, 39, 86, 1, 23, 11, 50, 79, 74, 52, 79, 83, 56, 75 , 31, 50, 43, 0, 38, 82, 14, 48, 78, 88, 77, 97, 44, 96, 76, 83 , 61, 0, 32, 30, 22, 12, 1, 7, 56, 90, 49, 58, 21, 18, 62, 23 , 85, 58, 28, 52, 16, 58, 49, 42, 57, 98, 59, 97, 23, 25, 65, 53 , 3, 90, 89, 79, 50, 25, 53, 18, 49, 36, 42, 47, 33, 54, 27, 59 }; const int countIterations = 200000; //////////////////////////////////////////// SearchLooping searchLoop = new SearchLooping(); DateTime start = DateTime.Now; int count = 0; for (int it = 0; it < countIterations; it++) count = searchLoop.Search(a, b); TimeSpan span = DateTime.Now - start; Console.WriteLine("Search with looping. Count = {0}, Elapsed msec= {1}" , count, span.TotalMilliseconds); /////////////////////////////////////////// SearchFlat searchFlat = new SearchFlat(); DateTime start2 = DateTime.Now; int count2 = 0; for (int it = 0; it < countIterations; it++) count2 = searchFlat.Search(a, b); TimeSpan span2 = DateTime.Now - start2; Console.WriteLine("Search with switch. Count = {0}, Elapsed msec= {1}" , count2, span2.TotalMilliseconds); Console.ReadLine(); } } }

Согласно рассмотренной схеме разработки и выполнения приложений.NET, компиляторы исходных языков программирования, используемых разработчиками, компилируют приложение не в машинный код для конкретной операционной системы и процессора, а в промежуточный код на языке MSIL. Полученный таким образом исполняемый файл, помимо собственно кода приложения, содержит и метаданные - служебную информацию о приложении. Такие исполняемые файлы называются сборками и являются аналогами файлов EXE и DLL для обычных приложений. Затем при выполнении приложения сборка загружается операционной средой.NET Framework и уже там компилируется в машинный код. Такая схема выполнения приложения в архитектуре.NET дает существенные преимущества:

Приложения.NET являются платформенно-независимыми при условии, что имеется соответствующий вариант операционной среды для той или иной операционной системы.

Метаданные, прикомпилированные к коду приложения, позволяют избавиться от громоздких библиотек типов и регистрации в системном реестре, за что справедливо критикуют приложения СОМ. Приложение.NET готово к работе сразу.

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

Но, конечно, у такого подхода есть и недостатки. Разработчики Microsoft, разумеется, знали об этом и постарались ликвидировать или минимизировать большинство проблем.

Наиболее очевидные из них:

Архитектура громоздка - для исполнения приложения нужна операционная среда.

Необходимость компиляции в машинный код замедляет выполнение приложения.

Код MSIL является небезопасным с точки зрения подделок - любая незашифрованная сборка может быть модифицирована кем угодно.

Состав сборки

В первую очередь (рис. 3), в состав сборки входит манифест - метаданные, включающие информацию о сборке:

1. версия приложения, состоящая из четырех чисел;

2. список имен файлов, составляющих сборку, а также контрольные суммы для каждого файла из списка;

3. список имен и версий других сборок, используемых данной сборкой;

4. список типов и ресурсов. Они делятся на два вида по доступности: только внутри сборки (internal) и вне сборки (public);

5. сведения о защите сборки: права на запуск, информация о лицензировании.

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

Версия сборки состоит из двух частей и четырех чисел. Основная часть включает основную (major) и дополнительную (minor) версии приложения. Дополнительная часть содержит номер построения приложения (build) и номер ревизии (revision). При поиске сборки по номеру версии основная часть должна обязательно совпадать с искомой, а затем выбирается сборка с максимальной дополнительной частью.

Рисунок 3. Виды сборок

Далее сборка включает метаданные - сведения о приложении, необходимые для работы в среде выполнения CLR, прикомпилированные ресурсы и т. д. И, наконец, в сборку включается собственно код приложения, созданный на промежуточном языке MSIL.

Благодаря наличию манифеста и метаданных, приложения.NET называются самоописываемыми, т. е. всю необходимую информацию о себе приложение «носит с собой». И это очень важное преимущество. Если вы вспомните приложения СОМ, то там для получения информации о приложении используется библиотека типов и само приложение нужно зарегистрировать в системном реестре. Без этого приложение СОМ просто не станет работать! А в.NET приложение готово к использованию сразу же после переноса на компьютер.

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

Приватные сборки (private assemblies) доступны только в рамках приложения-владельца. Разделяемые сборки (shared assemblies) - для всех заинтересованных приложений. Такие сборки должны храниться в специальном глобальном кэше сборок. Обычно он находится в папке.WINNT\Assembly. Но для разделяемых сборок необходимо соблюдать правило уникальности именования. Если приложение хочет использовать разделяемую сборку, оно не должно содержать одноименную сборку.

Метаданные

Когда компилятор.NET создает код MSIL, параллельно он производит и метаданные, которые включаются в файлы сборки приложения. Метаданные содержат всю информацию о приложении, необходимую для его исполнения в среде выполнения CLR. Важной составной частью метаданных является манифест, который уже был рассмотрен. Но помимо него метаданные включают и другие сведения:

имя приложения;

публичный ключ;

информацию о типах;

атрибуты;

Публичный ключ необходим в системе безопасности среды выполнения CLR для расшифровки зашифрованных сборок.

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

Атрибуты сборки - настраиваемый набор элементов. Разработчик может добавить сюда собственные элементы с любой необходимой информацией о сборке или экспортируемых типах. Если сборка содержит метаданные, то код приложения является управляемым - пригодным для выполнения в среде выполнения CLR. В противном случае код называется неуправляемым. Компиляторы Delphi, C#, Visual Basic генерируют управляемый код. Компилятор C++, в зависимости от настроек, может создавать коды обоих видов. Если приложение.NET работает с каким-либо сервером СОМ, то оно использует неуправляемый код.

Необходимость в метаданных типов

Возможность полностью описывать типы (классы, интерфейсы, структуры, перечисления и делегаты) с помощью метаданных является одной из ключевых в платформе.NET. Во многих технологиях.NET, таких как сериализация объектов, удаленная работа, веб-службы XML и Windows Communication Foundation (WCF), эта возможность нужна для выяснения формата типов во время выполнения. Более того, в средствах обеспечения функциональной совместимости между языками, многочисленных службах компилятора и предлагаемой в IDE-среде функции IntelliSense везде за основу берется конкретное описание типа.

Невзирая на важность (а, возможно, и благодаря ей), метаданные не являются новинкой, поставляемой только в.NET Framework. В Java, CORBA и СОМ тоже применяются похожие концепции. Например, в СОМ для описания типов, содержащихся внутри сервера СОМ, используются специальные библиотеки типов СОМ (которые являются не более чем просто скомпилированным IDL-кодом). Как и в СОМ, в библиотеках кода в.NET поддерживаются метаданные типов, но эти метаданные, конечно же, синтаксически совершенно не похожи на IDL-метаданные из СОМ.

Вспомните, что утилита ildasm.exe позволяет просматривать метаданные всех содержащихся в сборке типов, для чего в ней нужно нажать комбинацию клавиш Ctrl+M. Если открыть в этой утилите любую из сборок *.dll или *.ехе и нажать Ctrl+M, можно увидеть метаданные всех содержащихся в ней типов, как показано на рисунке:

На этом рисунке видно, что метаданные типов.NET отображаются в ildasm.exe очень подробно (в двоичном формате они гораздо компактнее). В действительности описание всех метаданных обычной сборки заняло бы несколько страниц. Однако вполне достаточно будет кратко рассмотреть только некоторые наиболее важные описания метаданных сборки.

Глубоко вдаваться в то, что обозначает синтаксис в каждом из приводимых фрагментов метаданных.NET, не стоит. Главное - понять, что метаданные.NET являются очень описательными и предусматривают перечисление каждого определенного внутри (или упоминаемого с помощью внешней ссылки) типа, который встречается в данной кодовой базе.

Каждый тип, который определен внутри текущей сборки, сопровождается маркером TypeDef #n (TypeDef - сокращение от type definition (определение типа)). Если описываемый тип предусматривает использование еще какого-то типа, определенного в другой сборке.NET, этот второй тип сопровождается маркером TypeRef #n (TypeRef - сокращение от type reference (ссылка на тип)). Маркер TypeRef, по сути, является указателем на полное определение метаданных соответствующего типа во внешней библиотеке. Вкратце, метаданные в.NET представляют собой ряд таблиц, в которых явным образом перечислены все определения типов (TypeDef) и типы, на которые они ссылаются (TypeRef), причем те и другие можно просматривать в специальном окне метаданных утилиты ildasm.exe.

Например в сборке fontinfo.dll, рассматривавшейся в предыдущем разделе, можно встретить подробное описание классов:

Давайте рассмотрим полученные данные более подробно. Маркер TypDefName используется для описания имени данного типа, маркер Extends - для описания базового класса, который лежит в его основе (и каковым в данном случае является тип System.Object), а маркер Field #n - для описания каждого поля, которое входит в его состав. Маркеры Method #n содержат подробное описание инкапсулированных в классе методов.

Последнее обновление: 31.10.2015

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

Аннотации данных для отображения свойств

Аннотации данных представляют собой атрибуты, которые вы можете найти в пространстве имен System.ComponentModel.DataAnnotations (хотя несколько атрибутов определено в других пространствах).

Атрибут Display

Итак, предположим у нас имеется некоторая модель Book:

Public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public int Year { get; set; } }

И мы пытаемся получить из базы данных один объект этой модели:

Public class HomeController: Controller { BookContext db = new BookContext(); public ActionResult Index() { var firstBook = db.Books.FirstOrDefault(); return View(firstBook); } }

Используя соответствующий хелпер, мы выводим эту модель представлении: @Html.DisplayForModel() :

@model DataAnnotations.Models.Book @{ ViewBag.Title = "Книга"; } @Html.DisplayForModel()

Обычный код, но тут мы сталкиваемся с проблемой:

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

Конечно, в этом случае мы могли бы использовать @Html.LabelFor для настройки названия для каждого отдельного свойства, но в этом случае у нас бы увеличился в несколько раз объем кода, и мы не смогли бы одной строкой вывести всю информацию о модели. К тому же может потребоваться в нескольких представлениях выводить информацию о модели. Поэтому данный подход не оптимален.

И тут нам на помощь приходят аннотации данных, а именно атрибут Display . Нам достаточно поправить модель, указав у нее параметры отображения:

Using System.ComponentModel.DataAnnotations; ........................................... public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public int Year { get; set; } }

Свойство Name атрибута Display содержит строку, которая будет отображаться вместо имени свойства. Больше нам ничего не надо менять. Запустим и увидим новые названия:

Атрибут HiddenInput

В предыдущем примере у нас осталась одна проблемка - это поле Id. Иногда, конечно, может потребоваться вывод поля Id. Но, например, если бы мы выводили модель в режиме редактирования с помощью хелпера @Html.EditorForModel() , то данное поле было бы доступно для редактирования, что не очень хорошо, особенно когда идентификаторы не должны меняться. Чтобы скрыть это поле мы можем применить атрибут HiddenInput :

Using System.ComponentModel.DataAnnotations; using System.Web.Mvc; ........................................... public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public int Year { get; set; } }

Свойство DisplayValue=false указывает, что надо скрыть данное поле. В итоге вы его не увидите:

При использовании хелперов редактирования (Html.EditorFor/Html.EditorForModel) для данного свойства будет сгенерировано скрытое поле:

Атрибут ScaffoldColumn

При редактировании модели атрибут HiddenInput полностью не скрывает поля, так как мы можем посмотреть исходный код страницы и найти соответствующие поля. Чтобы полностью скрыть свойство от хелперов, используется атрибут ScaffoldColumn :

Public int Id { get; set; }

Теперь хелперы редактирования не увидят данное свойство и не создадут для него даже скрытое поле на странице.

Атрибут DataType

Атрибут DataType позволяет предоставлять среде выполнения информацию об использовании свойства. Например, допустим, у нас есть свойство Password:

Public string Password { get; set; }

Для свойства с атрибутом DataType.Password HTML-хелперы создают элемент ввода, у которого атрибут type имеет значение "password". Тогда в браузере вы при вводе данных вы не увидите вводимые символы, а вместо них будут выводиться точки.

Перечисление DataType может принимать несколько различных значений:

Атрибут UIHint

Данный атрибут указывает, какой будет использоваться шаблон отображения при создании разметки html для данного свойства. Шаблон управляет, как свойство будет рендерится на странице.

Имеются следующие встроенные шаблоны:

    Boolean

    Хелперы редактирования создают флажок (checkbox) для булевых значений. Для значений типа bool? (nullable) создается элемент select с параметрами True, False и Not Set

    Хелперы отображения генерируют те же элементы html, что и хелперы редактирования, только с атрибутом disabled

    Collection

    Используется соответствующий шаблон для рендеринга каждого элемента коллекции. Причем элементы могут быть разных типов.

    Decimal

    Хелперы редактирования создают однострочное текстовое поле - элемент input

    EmailAddress

    HiddenInput

    Создается скрытое поле - элемент hidden input

    Html

    Хелперы редактирования создают однострочное текстовое поле.

    Хелперы отображения просто показывают текст

    MultilineText

    Хелперы редактирования создают многострочное текстовое поле (элемент textarea)

    Object

    Хелперы изучают свойства объекта и выбирают наиболее подходящие для него шаблоны.

    Password

    Хелперы редактирования создают текстовое поле для ввода символов с использованием маски

    Хелперы отображения показывают пароль как есть, без использования маски

    String

    Хелперы редактирования создают однострочное текстовое поле

    Хелперы редактирования создают текстовое поле

Например, используем последний шаблон Url:

Public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public int Year { get; set; } }

Тогда мы получим следующий результат:

Таким образом, мы можем управлять отображением свойств модели в представлении.



Загрузка...