Note
Please see Azure Cognitive Services for Speech documentation for the latest supported speech solutions.
Microsoft Speech Platform
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.
<pre IsFakePre="true" xmlns="http://www.w3.org/1999/xhtml"> <strong>HRESULT Serialize(</strong><a runat="server" href="jj127886(v=msdn.10).md"><strong>SPSERIALIZEDRESULT</strong></a> **<em>ppCoMemSerializedResult</em> <strong>);</strong> </pre>
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.
`
// Declare local identifiers: HRESULT hr = S_OK; CComPtr<ISpRecoResult> cpRecoResult; CComPtr<ISpRecoResult> cpRecoResultNew; CComPtr<IStream> cpStreamWithResult; CComPtr<ISpRecoContext> cpRecoContext; SPSERIALIZEDRESULT* pSerializedResult = NULL; ULONG cbWritten = 0; ULONG ulSerializedSize = 0; LARGE_INTEGER liseek; LARGE_INTEGER li;`// ... Obtain a recognition result object from the recognizer ... hr = CreateStreamOnHGlobal(NULL, true, &cpStreamWithResult;);
if (SUCCEEDED(hr)) { // Serialize result to memory. hr = cpRecoResult->Serialize(&pSerializedResult;); }
if (SUCCEEDED(hr)) { // Serialize to a stream pointer. hr = cpStreamWithResult->Write(pSerializedResult, pSerializedResult->ulSerializedSize, &cbWritten;); }
if (SUCCEEDED(hr)) { // Free the serialized result. if (pSerializedResult) ::CoTaskMemFree(pSerializedResult);
// Commit the stream changes. hr = cpStreamWithResult->Commit(STGC_DEFAULT); }
if (SUCCEEDED(hr)) { // ... Persist stream to disk, network share, and so on ... // ... 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); }
if (SUCCEEDED(hr)) { // Find the size of the stream. hr = cpStreamWithResult->Read(&ulSerializedSize;, sizeof(ULONG), NULL); }
if (SUCCEEDED(hr)) { // Reset the seek pointer: liseek.QuadPart = 0 - sizeof(ULONG); hr = cpStreamWithResult->Seek(liseek, STREAM_SEEK_CUR, NULL); }
if (SUCCEEDED(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); }
if (SUCCEEDED(hr)) { // Deserialize result from memory. hr = cpRecoContext->DeserializeResult(pSerializedResult, &cpRecoResultNew;); }
if (SUCCEEDED(hr)) { // Free the pSerializedResult memory. if (pSerializedResult) CoTaskMemFree(pSerializedResult); }
// As long as the same engine was used to generate original // result object, as is now being used, applications can // now get alternates for the cpRecoResultNew's phrase.