自定义数据格式

创建自定义数据格式的指南

用户可以在联机时共享各种信息。成功的应用会花一定时间来分析用户最有可能与其他人共享哪些类型的信息,并打包该信息,以便接收应用可以正确地处理该信息。在许多情况下,用户希望共享的信息属于 Windows 支持的六种标准格式之一。但是,在某些情况下,拥有一种更有针对性的数据类型可能会创建更好的用户体验。对于这些情况,你的应用可以支持自定义数据格式。

示例

若要演示如何考虑创建自定义格式,请查看以下示例。

在虚拟公司 Fabrikam,一名开发人员编写了一个共享在线存储的文件的应用。一个选项将是使用流支持的存储项,但这会非常耗时且效率低下,因为目标应用会结束将文件下载到本地来读取它们。相反,该开发人员决定创建一个自定义格式以用于这些文件类型。

首先,该开发人员考虑了新格式的定义。在这种情况下,该格式是在线存储的所有文件类型(文档、图像等)的集合。因为这些文件位于 Web 上而不是本地计算机上,所以该开发人员决定将该格式命名为 WebFileItems。

接下来,开发人员需要决定格式的详情以及决定以下内容:

  • 格式应由 IPropertyValue 组成,后者包含的 InspectableArray 表示统一资源标识符 (URI)。
  • 该格式必须包含至少 1 个项,但对于可以包含多少个项没有限制。
  • 允许使用任何有效的 URI。
  • 请勿使用在源应用程序边界以外无法访问的 URI(例如经过身份验证的 URI)。

确定此信息之后,该开发人员现在有足够的信息来创建和使用自定义格式。

我的应用是否应该使用自定义格式?

Windows 10 中的共享功能支持六种标准数据格式:

  • 文本
  • HTML
  • 位图
  • 存储项
  • URI
  • RTF

这些格式通用性很好,这使得你的应用可以很容易地快速支持共享和接收共享内容。这些格式的缺点是它们不会始终为接收应用提供数据的丰富描述。为了说明这一点,请查看以下字符串,该字符串代表一个邮政地址:

1234 Main Street, New York, NY 98208

应用可以使用 DataPackage.setText 共享此字符串。但是,因为接收此文本字符串的应用不会确切知道该字符串代表什么,所以该应用可以对该数据进行的处理会受到限制。通过使用自定义数据格式,源应用可以使用 http://schema.org/Place 格式将正在共享的数据定义为一个“位置”。这样会为接收应用提供一些其他信息,接收应用可以使用这些信息按用户期望的方式处理该信息。使用现有架构格式允许你的应用挂接到已定义格式的更大数据库中。

自定义格式还可以帮助你提供更多共享数据的高效方式。例如,用户有一些照片集存储在 Microsoft OneDrive 上并且决定在社交网络上共享其中的一些照片。此方案很复杂,无法使用标准格式实现,原因如下:

  • 仅可使用 URI 格式一次共享一个项。
  • OneDrive 将集合共享为流支持的存储项。在此方案中使用存储项将需要应用下载每个图片,然后共享它们。
  • 使用文本和 HTML,可以提供链接列表,但这些链接的意义会丢失,接收应用不会了解这些链接表示用户希望共享的图片。

使用现有架构格式或自定义格式共享这些图片会提供以下两个主要优势:

  • 应用可以更快共享图片,原因是你可以创建一些 URI,而不是在本地下载所有图像。
  • 接收应用会了解这些 URI 表示图像,并且可以相应处理这些图像。

应做事项和禁止事项

定义自定义格式

如果你决定应用可以从定义自定义格式受益,那么你应当考虑以下事项:

  • 确保你了解标准数据格式,这样你只会在必要的情况下创建自定义格式。你应该查明在 http://www.schema.org 上是否存在会适合你的方案的现有格式。另一个应用将更有可能使用某个现有格式而不是你的自定义格式,这意味着更多的受众会实现你需要的端对端方案。
  • 考虑你要提供的体验。对你的用户希望采取哪些操作以及哪些数据格式可以最好地支持这些操作进行思考是很重要的。
  • 使你的自定义格式的定义对其他应用开发人员可用。
  • 对你的格式进行命名时,请确保该名称与格式的内容匹配。例如,UriCollection 指示所有 URI 都有效,而 WebImageCollection 指示该格式仅包含指向联机图像的 URI。
  • 仔细考虑格式的含义。明确了解格式代表什么以及应如何使用格式。
  • 查看格式的结构。彻底考虑清楚格式是否支持多个项目或序列化,以及格式具有哪些限制。
  • 发布自定义格式后,请不要更改它。将自定义格式视为像 API 一样:可能会添加或弃用元素,但向后兼容性和长期支持是很重要的。
  • 请不要依赖格式组合。例如,不要期望某个应用能够理解:如果该应用看到一种格式,该应用还应当查找另一种格式。每种格式必须是自包含的。

向你的应用添加自定义格式

在定义自定义格式之后,当向你的应用添加该格式时遵循以下建议:

  • 使用其他应用测试该格式。确保从源应用到目标应用,数据都得到正确处理。
  • 坚持该格式的预期目的。不要以非预期的方式使用该格式。
  • 如果你要编写一个源应用,至少还要提供一种标准格式。这可确保用户可以与不支持该自定义格式的应用共享数据。该体验对于用户可能不是很理想,但好过不允许用户与他们希望的应用共享数据。你还应该在线记录你的格式,以便其他应用程序可以知道去采用它。
  • 如果你要编写一个目标应用,请考虑至少支持一种标准格式。这样,即使源应用不使用你偏好的自定义格式,你的应用也可以从源应用接收数据。
  • 如果你希望接受另一个应用中的某个特定自定义格式(特别是来自某个不同的公司的格式),那么你应该仔细检查以看到已在线公开记录它。未记录的格式更有可能在不通知的情况下更改,从而可能会创建不一致或中断你的应用。

其他使用指南

选择数据类型

定义自定义格式时将做出的一个最重要的决定是用于在源应用程序和目标应用程序之间传输数据的 WinRT 数据类型。DataPackage 类支持自定义格式的多种数据类型:

定义格式时,请为数据选择适合的类型。此格式的所有使用者和接收者都使用同一数据类型是很重要的(即使存在不同的选项),否则,可能会在目标应用程序中导致意外的数据类型不匹配故障。

如果选择字符串作为格式的数据类型,则可以使用 GetTextAsync 函数的 GetTextAsync(formatId) 表单在目标端检索格式。此函数为你执行数据类型检查。否则,必须使用 GetDataAsync,这意味着你必须防止出现可能的数据类型不匹配。 例如,如果某个源应用程序提供单个 URI,且目标试图作为一个 URI 集合检索该 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)
选择用于共享的数据格式
共享数据
接收数据
示例
共享内容源应用示例
共享内容目标应用示例

 

 

显示:
© 2016 Microsoft