Serialização: Fazendo uma classe Serializable
Cinco etapas principais são necessárias para fazer uma classe serializável.Eles são listados abaixo e explicados nas seções a seguintes:
Derivar de sua classe de CObject (ou de alguma classe derivada de CObject).
Substituindo a função de membro Serialize.
Usando a macro DECLARE_SERIAL na declaração da classe.
Definir um construtor sem argumentos.
Usando a macro IMPLEMENT_SERIAL no arquivo de implementação para sua classe.
If you telefonar Serializediretamente em vez da a >> e << operadores de CArchive, as três últimas etapas não são necessárias para a serialização.
Derivar a classe de CObject
O protocolo de serialização básica e funcionalidade são definidos no CObject classe. Derivando sua classe de CObject (ou de uma classe derivada de CObject), sistema autônomo mostra a seguinte declaração de classe CPerson, você acessa o protocolo de serialização e a funcionalidade de CObject.
Substituindo a serializar a função de membro
The Serialize função de membro, que é definida na CObject classe, é responsável por, na verdade, serializar os dados necessários para capturar o estado corrente do objeto. The Serialize função possui um CArchive argumento que ele usa para ler e gravar os dados do objeto. The CArchive objeto tem uma função de membro, IsStoring, que indica se Serialize é armazenar (gravar dados) ou o carregamento (leitura de dados). Usando sistema autônomo resultados de IsStoring sistema autônomo guia, ou inserir dados de seu objeto na CArchive objeto com o (operador de inserção**<<) ou extrair dados com o operador de extração (>>**).
Considere uma classe derivada de CObject e tem duas variáveis de membro novas, tipos de CString e PALAVRA.O fragmento de declaração de classe a seguir mostra o novo membro variáveis e a declaração para a substituição Serialize função de membro:
class CPerson : public CObject
{
public:
DECLARE_SERIAL( CPerson )
// empty constructor is necessary
CPerson();
virtual ~CPerson();
CString m_name;
WORD m_number;
void Serialize( CArchive& archive );
};
Para substituir a função de membro Serialize
Chame sua versão de classe base de Serialize para certificar-se de que a parte herdada do objeto é serializado.
Insira ou extrair as variáveis de membro específicas para sua classe.
Os operadores de inserção e a extração de interagem com a classe de arquivar para ler e gravar os dados.O exemplo a seguir mostra como implementar Serialize para o CPerson classe declarada acima:
void CPerson::Serialize( CArchive& archive ) { // call base class function first // base class is CObject in this case CObject::Serialize( archive ); // now do the stuff for our specific class if( archive.IsStoring() ) archive << m_name << m_number; else archive >> m_name >> m_number; }
Você também pode usar o CArchive::Read and CArchive::Write funções de membro para ler e gravar grandes quantidades de dados sem tipo.
Usando a macro DECLARE_SERIAL
The DECLARE_SERIAL macro é necessária na declaração de classes que oferecerá suporte a serialização, conforme mostrado aqui:
class CPerson : public CObject
{
public:
DECLARE_SERIAL( CPerson )
Definir um construtor com sem argumentos
MFC exige um construtor padrão, quando ele recria sistema autônomo objetos sistema autônomo eles são desserializados (carregado a partir do disco).O processo de desserialização irá preencher todas as variáveis de membro com os valores necessários para recriar o objeto.
Esse construtor pode ser declarada pública, protegida ou particular.Se você fizer protegida ou particular, você ajudar a garantir que ele só será usado pelas funções a serialização.O construtor deve colocar o objeto em um estado que permite que ele seja excluído se necessário.
Observação: |
---|
Se você esquecer Para definir um construtor sem argumentos em uma classe que usa o DECLARE_SERIAL e IMPLEMENT_SERIALmacros, você receberá um aviso do compilador "nenhum construtor padrão disponível" na linha onde o IMPLEMENT_SERIAL macro é usada. |
Usando a macro IMPLEMENT_SERIAL no arquivo implementação
The IMPLEMENT_SERIAL macro é usada para definir as diversas funções necessárias ao se você derivar uma classe serializável da CObject. Você pode usar essa macro no arquivo de implementação (.CPP) para sua classe.Os dois primeiros argumentos para a macro são o nome da classe e o nome da sua classe base imediata.
O terceiro argumento para essa macro é um número de esquema.O número de esquema é essencialmente um número de versão para objetos da classe.Use um número inteiro maior que ou igual a 0 para o número de esquema.(Não confunda esse número de esquema com terminologia de banco de dados.)
O código de serialização do MFC verifica o número de esquema durante a leitura de objetos na memória.Se o número de esquema do objeto no disco não coincidir com o número do esquema da classe na memória, a biblioteca lançará um CArchiveException, impedindo seu programa de leitura de uma versão incorreta do objeto.
Se você desejar que o seu Serialize função de membro para ser capaz de ler várias versões — ou seja, sistema autônomo arquivos criados com versões diferentes do aplicativo — você pode usar o valor VERSIONABLE_SCHEMA sistema autônomo um argumento para o IMPLEMENT_SERIAL macro. Para obter informações sobre o uso e um exemplo, consulte o GetObjectSchema função de membro de classe CArchive.
O exemplo a seguir mostra como usar IMPLEMENT_SERIAL para uma classe CPerson, que é derivado de CObject:
IMPLEMENT_SERIAL( CPerson, CObject, 1 )
Uma vez que você tenha uma classe serializável, você pode serializar objetos da classe, conforme discutido no artigo Serialização: Serializando um objeto.