Identificadores flexibles

Los identificadores flexibles se utilizan para identificar las réplicas, elementos o unidades de cambio. Sync Framework admite los tipos siguientes de identificadores flexibles:

  • Identificador de longitud fija

    Un identificador de longitud fija siempre tiene la misma longitud cada vez que se utiliza. La longitud se especifica en el esquema de formato de identificador.

  • Identificador de longitud variable

    Un identificador de longitud variable tiene una longitud que puede variar cada vez que se utiliza. La longitud máxima se especifica en el esquema de formato de identificador.

Código administrado: un identificador se representa mediante la clase SyncId. Esta clase contiene un identificador y un valor que indica si es de longitud variable.

Código no administrado: un identificador se representa como una matriz de bytes. La estructura SYNC_ID representa los identificadores de longitud variable. Esta estructura contiene la longitud del identificador y el identificador representado como una matriz de bytes.

Esquema de identificador

Los formatos de identificador se definen en un esquema que especifica la información siguiente sobre cada identificador en el sistema:

  • Si el identificador es de longitud fija o de longitud variable.

  • El tamaño, si el identificador es de longitud fija, o el tamaño máximo, si es de longitud variable.

Código administrado: el formato de identificador se especifica mediante la clase SyncIdFormatGroup.

Código no administrado: el formato de identificador se especifica mediante la estructura ID_PARAMETERS.

Este esquema se debe proporcionar a varios métodos de Sync Framework y se utiliza para asegurarse de que todos los objetos utilizan la misma información de esquema de identificador.

En una sesión de sincronización, se consultan los esquemas en ambos proveedores. Los esquemas se comparan después para comprobar que ambos proveedores usan el mismo. Si se produce un error en esta comprobación, no se creará la sesión.

Código administrado: la sesión obtiene el esquema de un proveedor utilizando la propiedad IdFormats.

Código no administrado: la sesión obtiene el esquema de un proveedor utilizando el método ISyncProvider::GetIdParameters.

Nota

El formato de un identificador que se pasa a un método de Sync Framework debe coincidir con el formato que se especifica en el esquema de formato de identificador. En caso contrario, el método devolverá un error.

Formato recomendado para los identificadores globales

Un identificador global se requiere para cada elemento en el ámbito de sincronización y debe ser único en una comunidad de sincronización. Un identificador global es un identificador flexible y, por tanto, puede usar cualquier formato. Sin embargo, dado que los metadatos pueden representar un grupo ordenado de identificadores como un intervalo único, los metadatos son más compactos cuando los identificadores se enumeran como grupos ordenados. El uso de intervalos también hace que el mantenimiento de los metadatos sea más eficaz. Por consiguiente, puede ser útil hacer que el orden de los identificadores se ajuste lógicamente al orden que sea más conveniente para la enumeración. Para el formato de un identificador global, recomendamos que se utilice un GUID de 16 bytes con un prefijo de 8 bytes, como la clase SyncGlobalId administrada o la estructura SYNC_GID no administrada.

Consideraciones especiales para los datos jerárquicos

En situaciones en las que los elementos que se sincronizan tienen una jerarquía, puede ser útil colocar un número con una progresión continua, como una hora, en el prefijo del identificador. Dado que los elementos primarios normalmente se crearán antes que los secundarios, los primarios aparecerán antes en el orden de enumeración. Esto permite a los proveedores tener que tratar menos con elementos desordenados en los que se deben aplicar.

La siguiente es una solución para asignar identificadores globales para los datos jerárquicos:

  1. Cree un contador que sea suficientemente grande como para indizar todos los elementos únicos de la réplica.

  2. A partir de la raíz del ámbito, favorezca la profundidad sobre el ancho y atraviese el sistema.

  3. Para cada elemento (primario o secundario), genere un GUID.

  4. Anteponga al GUID la hora.

A los elementos nuevos que se crean se les puede asignar identificadores globales utilizando este mismo método, independientemente de sus contenedores o de los elementos individuales anidados.

Tratamiento de la memoria en código no administrado

Los identificadores se representan como punteros a matrices de bytes. Por consiguiente, para los identificadores de longitud fija, convertir el identificador que se utiliza en un puntero de bytes es suficiente. Para los identificadores de longitud variable, a los datos del identificador se les debe anteponer el tamaño de búfer, como en la estructura SYNC_ID.

Nota

Sync Framework nunca mantendrá una referencia a un identificador que el autor de las llamadas asigne. Si Sync Framework debe mantener un identificador, asignará su propia memoria para él y lo copiará internamente. Los autores de las llamadas son los responsables de asignar y liberar la memoria que está asociada a los identificadores.

Identificadores como valores devueltos en el código no administrado

Los identificadores de longitud variable se devuelven en los métodos Sync Framework en un proceso de dos llamadas:

  1. Se llama al método para determinar el tamaño del identificador.

  2. El autor de las llamadas asigna la memoria y llama a la función de nuevo, y esta vez proporciona el búfer recién asignado y su tamaño.

Un usuario puede optimizar este proceso asignando un búfer del tamaño correcto o del tamaño máximo. En este caso, la primera llamada es innecesaria, aunque el autor de las llamadas siempre debería comprobar el HRESULT devuelto para asegurarse de que el búfer tenía el tamaño correcto.

Los métodos que devuelven identificadores de longitud fija no utilizan el proceso de dos pasos. En su lugar, simplemente proporcionan un búfer con la longitud correcta. El parámetro del tamaño es opcional si se solicita un identificador de longitud fija (se puede proporcionarNULL ). Si se pasa el tamaño, el método actúa como en el caso del identificador de longitud variable. Esto significa que, si el tamaño es menor que el identificador que se va a devolver, se devolverá un código de error que indica que hay más datos disponibles y la variable de tamaño almacenará el tamaño que se requiere. Si el tamaño es mayor que el necesario, el método se ejecutará y se devolverá el tamaño necesario.

Intervalos

Se puede hacer referencia a un bloque de identificadores ordenados como un intervalo. Un intervalo utiliza los identificadores superior e inferior como límites cerrados para el intervalo.

Código administrado: los límites del intervalo se pasan directamente a los métodos que los usan.

Código no administrado: un intervalo se representa utilizando la estructura SYNC_RANGE.

Vea también

Referencia

Estructura ID_PARAMETERS
Estructura ID_PARAMETER_PAIR
Estructura SYNC_ID
Estructura SYNC_RANGE
SyncIdFormatGroup
SyncIdFormat
SyncId

Conceptos

Administración de los metadatos
Requisitos de metadatos