ISpRecoResult::Serialize

Microsoft Speech SDK

The Microsoft.com Speech website Microsoft Speech SDK SAPI 5.1

ISpRecoResult::Serialize

ISpRecoResult::Serialize creates a serialized copy of the recognition result object. The serialized copy can be saved and later restored using ISpRecoContext::DeserializeResult.

HRESULT Serialize(
   SPSERIALIZEDRESULT   **ppCoMemSerializedResult
);

Parameters

ppCoMemSerializedResult
[out] Address of a pointer to the SPSERIALIZEDRESULT structure that receives the serialized result information. Call CoTaskMemFree() to free the memory associated with the serialized result object.

Return values

Value Description
S_OK Function completed successfully.
E_POINTER ppCoMemSerializedResult is an invalid pointer.
E_OUTOFMEMORY Exceeded available memory.
FAILED(hr) Appropriate error message.

Example

The following code snippet illustrates the use ISpRecoResult::Serialize to serialize a result and deserialize it back into an ISpRecoContext object.

    HRESULT hr = S_OK;

    // ... obtain a recognition result object from the recognizer...

    SPSERIALIZEDRESULT* pSerializedResult = NULL;
    ULONG cbWritten = 0;
    ULONG ulSerializedSize = 0;
    LARGE_INTEGER liseek;
    LARGE_INTEGER li;
    CComPtr<IStream> cpStreamWithResult;

    hr = CreateStreamOnHGlobal(NULL, true, &cpStreamWithResult);
    // Check hr

    // Serialize result to memory
    hr = cpRecoResult->Serialize(&pSerializedResult);
    // Check hr

    //serialized to a stream pointer
    hr = cpStreamWithResult->Write(pSerializedResult, pSerializedResult->ulSerializedSize, &cbWritten);
    // Check hr

    // free the serialized result
    if (pSerializedResult) ::CoTaskMemFree(pSerializedResult);

    // commit the stream changes
    hr = cpStreamWithResult->Commit(STGC_DEFAULT);
    // Check hr

    // ... persist stream to disk, network share, etc...
    // ... shutdown application .... 

    // ... restart application and get the persisted stream

    // reset the stream seek pointer to the start before deserialization
    li.QuadPart = 0;
    hr = cpStreamWithResult->Seek(li, STREAM_SEEK_SET, NULL);
    // Check hr

    // find the size of the stream
    hr = cpStreamWithResult->Read(&ulSerializedSize, sizeof(ULONG), NULL);
    // Check hr

    // reset the seek pointer
    liseek.QuadPart = 0 - sizeof(ULONG);
    hr = cpStreamWithResult->Seek(liseek, STREAM_SEEK_CUR, NULL);
    // Check hr

    // allocate the memory for the result
    pSerializedResult = (SPSERIALIZEDRESULT*)::CoTaskMemAlloc(ulSerializedSize);
    // Check pSerializedResult in case out "out-of-memory"

    // copy the stream into a serialized result object
    hr = cpStreamWithResult->Read(pSerializedResult, ulSerializedSize, NULL);
    // Check hr

    // Deserialize result from memory
    hr = cpRecoContext->DeserializeResult(pSerializedResult, &cpRecoResultNew);
    // Check hr

    // free the pSerializedResult memory
    if (pSerializedResult) {
        CoTaskMemFree(pSerializedResult);
    }

    // As long as the same engine was used to generate
    // the original result object, as is now being used,
    // applications can now get alternates for the cpRecoResultNew's phrase