Поделиться через


Гибкие идентификаторы

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

  • Идентификатор фиксированной длины

    Идентификатор фиксированной длины имеет одну и ту же длину при каждом использовании. Эта длина задается в схеме форматов идентификаторов.

  • Идентификатор переменной длины

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

Управляемый код. Идентификатор представляется классом SyncId. Этот класс содержит идентификатор и значение, показывающее, имеет ли идентификатор переменную длину.

Неуправляемый код. Идентификатор представляется в виде массива байтов. Идентификаторы переменной длины представляются структурой SYNC_ID. Эта структура содержит длину идентификатора и сам идентификатор, представленный в виде массива байтов.

Схема идентификаторов

Форматы идентификаторов определяются в схеме, которая задает для каждого идентификатора в системе следующие сведения:

  • имеет ли идентификатор фиксированную или переменную длину;

  • размер идентификатора фиксированной длины или максимальный размер идентификатора переменной длины.

Управляемый код. Схема форматов идентификаторов задается с помощью класса SyncIdFormatGroup.

Неуправляемый код. Схема форматов идентификаторов задается с помощью структуры ID_PARAMETERS.

Эту схему необходимо передавать различным методам Sync Framework и применять для согласования данных схемы идентификаторов, используемых во всех объектах.

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

Управляемый код. Сеанс возвращает схему поставщика с помощью свойства IdFormats.

Неуправляемый код. Сеанс возвращает схему поставщика с помощью метода ISyncProvider::GetIdParameters.

Примечание

Формат идентификатора, передаваемый в метод Sync Framework, должен совпадать с форматом, заданным в схеме форматов идентификаторов. В противном случае метод завершится ошибкой.

Рекомендуемый формат для глобальных идентификаторов

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

Особые вопросы использования иерархических данных

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

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

  1. Создайте счетчик достаточного размера, чтобы проиндексировать все уникальные элементы в реплике.

  2. Пройдите по системе, начиная с корневого элемента и выбирая переход на нижний уровень вместо перехода в пределах уровня.

  3. Создайте идентификатор GUID для каждого элемента (родительского или дочернего).

  4. Задайте для идентификатора GUID префикс, содержащий время по часам.

Для новых созданных элементов можно назначить глобальные идентификаторы тем же способом, независимо от их контейнеров или вложенных отдельных элементов.

Работа с памятью в неуправляемом коде

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

Примечание

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

Идентификаторы в качестве возвращаемых значений в неуправляемом коде

Идентификаторы переменной длины возвращаются методами Sync Framework в процессе, состоящем из двух вызовов:

  1. метод вызывается, чтобы определить размер идентификатора;

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

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

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

Диапазоны

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

Управляемый код. Границы диапазона передаются непосредственно в методы, работающие с диапазонами.

Неуправляемый код. Диапазон представляется с помощью структуры SYNC_RANGE.

См. также

Справочник

SyncIdFormatGroup

SyncIdFormat

SyncId

Другие ресурсы

Управление метаданными для стандартных поставщиков

Требования к метаданным для стандартных поставщиков

Структура ID_PARAMETERS

Структура ID_PARAMETER_PAIR

Структура SYNC_ID

Структура SYNC_RANGE