다음을 통해 공유


증분 Serialization

증분 스타일 serialization을 사용하는 경우 버퍼를 조작하는 세 가지 루틴을 제공합니다. 이러한 루틴은 Alloc, Read 및 Write입니다. Alloc 루틴은 필요한 크기의 버퍼를 할당합니다. 쓰기 루틴은 데이터를 버퍼에 쓰고 읽기 루틴은 마샬링된 데이터가 포함된 버퍼를 검색합니다. 단일 serialization 호출은 이러한 루틴에 대해 여러 차례 호출할 수 있습니다.

직렬화의 증분 스타일은 다음 루틴을 사용합니다.

제공해야 하는 Alloc, Read 및 Write 함수의 프로토타입은 다음과 같습니다.

void __RPC_USER Alloc (
   void *State,          /* application-defined pointer */
   char **pBuffer,       /* returns pointer to allocated buffer */
   unsigned int *pSize); /* inputs requested bytes; outputs 
                         /* pBuffer size */

void __RPC_USER Write (
   void *State,          /* application-defined pointer */
   char *Buffer,         /* buffer with serialized data */
   unsigned int Size);   /* number of bytes to write from Buffer */

void __RPC_USER Read (
   void *State,          /* application-defined pointer */
   char **pBuffer,       /* returned pointer to buffer with data */
   unsigned int *pSize); /* number of bytes to read into pBuffer */

세 함수 모두에 대한 매개 변수의 상태 입력은 인코딩 서비스 핸들과 연결된 애플리케이션 정의 포인터입니다. 애플리케이션은 이 포인터를 사용하여 파일 핸들 또는 스트림 포인터와 같은 애플리케이션 관련 정보를 포함하는 구조에 액세스할 수 있습니다. 스텁은 상태 포인터를 Alloc, Read 및 Write 함수에 전달하는 것 외에는 수정하지 않습니다. 인코딩하는 동안 Alloc가 호출되어 데이터가 serialize되는 버퍼를 가져옵니다. 그런 다음, 애플리케이션이 직렬화된 데이터가 저장되는 시기와 위치를 제어할 수 있도록 쓰기가 호출됩니다. 디코딩하는 동안 읽기는 애플리케이션이 저장한 위치에서 요청된 직렬화된 데이터의 바이트 수를 반환하기 위해 호출됩니다.

증분 스타일의 중요한 기능은 핸들이 상태 포인터를 유지한다는 것입니다. 이 포인터는 상태를 유지 관리하며, 포인터를 Alloc, Write 또는 Read 함수에 전달하는 경우를 제외하고는 RPC 함수에 의해 전달되지 않습니다. 또한 핸들은 맞춤에 필요한 패딩을 추가하여 여러 형식 인스턴스를 동일한 버퍼로 인코딩하고 디코딩할 수 있는 내부 상태를 유지 관리합니다. MesIncrementalHandleReset 함수는 핸들을 초기 상태로 다시 설정하여 버퍼의 시작 부분에서 읽기 또는 쓰기를 사용하도록 설정합니다.

Alloc 및 Write 함수는 애플리케이션 정의 포인터와 함께 MesEncodeIncrementalHandleCreate 함수를 호출하여 인코딩 서비스 핸들과 연결됩니다. MesEncodeIncrementalHandleCreate 는 핸들에 필요한 메모리를 할당한 다음 초기화합니다.

애플리케이션은 MesDecodeIncrementalHandleCreate 를 호출하여 디코딩 핸들을 만들고, MesIncrementalHandleReset 을 호출하여 핸들을 다시 초기화하거나, MesHandleFree 를 호출하여 핸들의 메모리를 해제할 수 있습니다. Read 함수는 애플리케이션 정의 매개 변수와 함께 MesDecodeIncrementalHandleCreate 루틴을 호출하여 디코딩 핸들과 연결됩니다. 함수는 핸들을 만들고 초기화합니다.

MesIncrementalHandleReset의 UserState, Alloc, Write 및 Read 매개 변수는 NULL로 변경되지 않음을 나타낼 수 있습니다.