可变 ID

可变 ID 用于标识副本、项或变更单位。Sync Framework 支持以下可变 ID 类型:

  • 固定长度 ID

    固定长度 ID 在每次使用时始终为相同长度。长度在 ID 格式架构中指定。

  • 可变长度 ID

    可变长度 ID 在每次使用时长度可能不同。最大长度在 ID 格式架构中指定。

托管代码:ID 由 SyncId 类表示。此类包含 ID 以及指示该 ID 的长度是否可变的值。

非托管代码:将 ID 表示为字节数组。可变长度 ID 由 SYNC_ID 结构表示。此结构包含 ID 的长度以及表示为字节数组的 ID。

ID 架构

ID 格式在一个架构中定义,该架构指定有关系统中每个 ID 的以下信息:

  • ID 是固定长度的还是可变长度的。

  • 如果 ID 是固定长度的,则指定大小;如果 ID 是可变长度的,则指定最大大小。

托管代码:通过使用 SyncIdFormatGroup 类指定 ID 格式架构。

非托管代码:通过使用 ID_PARAMETERS 结构指定 ID 格式架构。

必须将此架构提供给不同的 Sync Framework 方法,并且此架构用于确保所有对象都使用相同的 ID 架构信息。

在同步会话中,将对这两个提供程序进行查询以获得其架构。然后,比较这些架构,以验证这两个提供程序是否使用相同的架构。如果此验证失败,将不会创建会话。

托管代码:会话通过使用 IdFormats 属性获取提供程序的架构。

非托管代码:会话通过使用 ISyncProvider::GetIdParameters 方法获取提供程序的架构。

备注

传递到 Sync Framework 方法的 ID 的格式必须与在 ID 格式架构中指定的格式相匹配,否则,此方法将失败。

建议的全局 ID 格式

同步作用域中的每个项都需要一个全局 ID,并且全局 ID 在整个同步社区中必须是唯一的。全局 ID 是可变 ID,因此,它可以使用任何格式。但是,因为元数据可以将 ID 排序组表示为单个范围,所以,当将 ID 枚举为排序组时,元数据将更为紧凑。使用范围还使得元数据的维护工作更为高效。因此,使 ID 的顺序在逻辑上适合便于枚举的顺序可能会很有用。对于全局 ID 的格式,我们建议您使用 16 字节 GUID 以及 8 字节前缀,如托管的 SyncGlobalId 类或非托管的 SYNC_GID 结构。

分层数据的特殊注意事项

在正在同步的项具有层次结构的情况下,在 ID 前缀中放一个单调递增的数字(如时钟时间)可能是非常有用的。因为父项通常在子项之前创建,所以父项在枚举顺序中将更早出现。这样,提供程序可以最大限度地减少将无序的项处理成它们必须遵循的顺序的要求。

一种为分层数据分配全局 ID 的方法是:

  1. 创建一个计数器,该计数器足够大,可以对副本中的所有唯一项编制索引。

  2. 从作用域的根开始,深度优先于广度,并遍历系统。

  3. 对于每个项(父项或子项),生成一个 GUID。

  4. 在 GUID 之前加上挂钟时间作为前缀。

可以使用这种相同方法向所创建的新项分配全局 ID,而不考虑其容器或嵌套的单独项。

非托管代码中的内存处理

ID 表示为指向字节数组的指针。因此,对于固定长度 ID,将正在使用的 ID 转换为字节指针就足够了。对于可变长度 ID,ID 数据必须以缓冲区大小作为前缀,如 SYNC_ID 结构中所示。

备注

Sync Framework 将从不维护对调用方分配的 ID 的引用。如果 Sync Framework 必须保留 ID,它将为此 ID 分配其自己的内存,并在内部复制此 ID。调用方负责分配和释放与 ID 关联的内存。

在非托管代码中作为返回值的 ID

在一个包含两个调用的过程中,从 Sync Framework 方法中返回可变长度 ID:

  1. 调用此方法以确定 ID 的大小。

  2. 调用方分配内存并再次调用此函数,此时将提供新分配的缓冲区及其大小。

用户可以通过分配正确大小的缓冲区或分配最大大小的缓冲区来优化此过程。在这种情况下,第一个调用是多余的,尽管调用方始终应验证返回的 HRESULT 以确保缓冲区具有正确的大小。

返回固定长度 ID 的方法不使用此两步过程。相反,方法只提供具有正确长度的缓冲区。当您请求固定长度 ID 时,大小参数是可选的(可能提供 NULL)。如果传递了大小,则方法所起的作用与对应于可变长度的情况相同。这意味着,如果大小小于要返回的 ID,将返回指示更多数据可用的错误代码,并且大小变量将存储所要求的大小。如果大小大于所要求的大小,则方法将成功并且将返回所要求的大小。

范围

已排序 ID 块可称为范围。范围使用下限 ID 和上限 ID 作为范围的封闭边界。

托管代码:直接将范围边界传递到使用范围的方法。

非托管代码:通过使用 SYNC_RANGE 结构表示范围。

请参阅

参考

ID_PARAMETERS 结构
ID_PARAMETER_PAIR 结构
SYNC_ID 结构
SYNC_RANGE 结构
SyncIdFormatGroup
SyncIdFormat
SyncId

概念

元数据管理
元数据要求