Руководство по созданию пользовательских форматов данных

Applies to Windows and Windows Phone

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

Пример

Чтобы проиллюстрировать процесс принятия решения о создании пользовательского формата, рассмотрим следующий пример.

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

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

Затем разработчик определяет разновидности формата и выбирает следующее.

  • Формат должен состоять из элемента IPropertyValue, содержащего массив InspectableArray, представляющий собой универсальные коды ресурсов (URI).
  • Формат должен содержать по меньшей мере 1 элемент, но число его элементов не ограничено.
  • Любой допустимый универсальный код ресурса (URI) разрешен.
  • Универсальные коды ресурса URI, которые недоступны за пределами границы исходного приложения (такие как URI с проверкой подлинности), нежелательны.

Определившись с этими вопросами, разработчик получает достаточно информации для создания и использования пользовательского формата.

Нужно ли использовать пользовательские форматы в приложении?

Функция общего доступа к данным в Windows 8 поддерживает шесть стандартных форматов данных:

  • текст
  • HTML
  • растровый рисунок (bitmap)
  • элементы для хранения (StorageItems)
  • универсальный код ресурса (URI)
  • RTF

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

1234 Main Street, New York, NY 98208

Программа может обеспечить общий доступ к этой строке с помощью DataPackage.setText. Но так как приложение, получающее эту текстовую строку, не может точно определить, что она собой представляет, его возможности манипулирования этими данными ограничены. Пользовательский формат данных позволит исходной программе определить данные, к которым предоставлен общий доступ, как "расположение" с помощью формата http://schema.org/Place. Таким образом принимающее приложение получит дополнительную информацию, которую оно сможет использовать, чтобы обработать полученные данные так, как этого ожидает пользователь. Использование существующих форматов схемы позволит вашему приложению присоединиться к более широкой базе данных, содержащей определенные форматы.

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

  • Формат URI может использоваться, только чтобы предоставить общий доступ к элементам коллекции по одному.
  • Служба OneDrive открывает общий доступ к коллекциям как к элементам StorageItems, которые поддерживаются потоками. Для использования StorageItems потребуется, чтобы ваше приложение скачивало каждое изображение по отдельности, а затем предоставляло общий доступ к изображениям.
  • Текст и HTML отображают список ссылок, но значение этих ссылок потеряно и принимающее приложение не сможет определить, что с помощью этих ссылок представлены изображения, которыми пользователь хочет поделиться.

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

  • Приложение сможет быстрее обеспечить общий доступ к изображениям, так как вместо локального скачивания всех изображений вы сможете создать коллекцию универсальных кодов ресурса (URI).
  • Принимающее приложение распознает, что данные коды URI представляют собой изображения, и сможет обработать их соответствующим образом.

Рекомендации

Определение пользовательского формата

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

  • При этом нужно знать стандартные форматы данных, чтобы не создавать пользовательский формат без необходимости. Вы должны проверить, имеется ли на сайте http://www.schema.org существующий формат, подходящий для вашего сценария. Весьма вероятно, что другое приложение будет использовать существующий формат, а не ваш пользовательский формат. Это означает, что более широкая аудитория может получить доступ к планируемым вами конечным сценариям.
  • Решите, какие возможности вы хотите предоставить пользователям. Важно обдумать, какие действия собираются совершать ваши пользователи и какие форматы данных лучше всего поддерживают эти действия.
  • Предоставьте другим разработчикам приложений доступ к определению вашего пользовательского формата.
  • Имя, которое вы присваиваете своему формату, должно отвечать его содержимому. Например, имя UriCollection указывает на то, что допустим любой универсальный код ресурса (URI), тогда как имя WebImageCollection показывает, что формат содержит только те URI, которые указывают на изображения в Интернете.
  • Хорошо продумайте назначение формата. Необходимо иметь четкое представление о том, что представляет собой формат и как его нужно использовать.
  • Проанализируйте структуру формата. Подумайте, сможет ли ваш формат поддерживать множество элементов и сериализацию, а также о его ограничениях.
  • Не изменяйте свой пользовательский формат после публикации. Рассматривайте его как API: элементы могут добавляться или устаревать, но важна обратная совместимость и длительная поддержка.
  • Не полагайтесь на сочетание форматов. Например, не стоит рассчитывать на то, что по наличию одного формата приложение определит, что нужно искать второй формат. Каждый формат должен быть автономным.

Добавление пользовательских форматов в программу

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

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

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

Выбор типа данных

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

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

Если в качестве типа данных для своего формата вы выбираете строку, вы можете получить ее на стороне конечного приложения с помощью формы GetTextAsync(formatId) функции GetTextAsync. Эта функция выполняет проверку типов данных. Иначе вам придется использовать GetDataAsync и обеспечивать защиту от потенциальных несовпадений типов данных. Например, если исходное приложение предоставляет один универсальный код ресурса (URI), а конечное пытается получить его как коллекцию таких кодов, возникает несоответствие. Во избежание таких конфликтов вы можете добавить код, аналогичный этому:

Заполнение объекта DataPackage


var uris = new Array();
uris[0] = new Windows.Foundation.Uri("http://www.msn.com");
uris[1] = new Windows.Foundation.Uri("http://www.microsoft.com");
var dp = new Windows.ApplicationModel.DataTransfer.DataPackage();
dp.setData("UriCollection", uris);


Получение данных


if (dpView.contains("UriCollection")) {
    dpView.getDataAsync("UriCollection").done(function(uris) {
        // Array.isArray doesn’t work – uris is projected from InspectableArray
        if (uris.toString() === "[object ObjectArray]") {
            var validUriArray = true;
            for (var i = 0; (true === validUriArray) && (i < uris.length); i++) {
                validUriArray = (uris[i] instanceof Windows.Foundation.Uri);
            }
            if (validUriArray) {
                // Type validated data 
            }
        }
    }
}


Связанные разделы

Для разработчиков (HTML)
Выбор форматов данных для предоставления общего доступа
Quickstart: Sharing content
Quickstart: Receiving shared content
Для разработчиков (XAML)
Выбор форматов данных для предоставления общего доступа
Quickstart: Sharing content
Получение общего содержимого
Примеры
Пример исходного приложения с общим доступом к содержимому
Пример конечного приложения с общим доступом к содержимому

 

 

Показ:
© 2014 Microsoft