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