Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Cinco etapas principais são necessárias para tornar uma classe serializável. Eles são listados abaixo e explicados nas seguintes seções:
Derivando sua classe de CObject (ou de alguma classe derivada).
CObjectUsando a macro DECLARE_SERIAL na declaração de classe.
Usando a macro IMPLEMENT_SERIAL no arquivo de implementação da classe.
Se você chamar Serialize diretamente e não por meio dos >> operadores do <<CArchive, as três últimas etapas não serão necessárias para serialização.
Derivando sua classe do CObject
O protocolo de serialização básico e a funcionalidade são definidos na CObject classe. Ao derivar sua classe de CObject (ou de uma classe derivada de CObject), conforme mostrado na declaração de classe CPersona seguir, você obtém acesso ao protocolo de serialização e à funcionalidade de CObject.
Substituindo a função de membro serializar
A Serialize função membro, que é definida na CObject classe, é responsável por serializar os dados necessários para capturar o estado atual de um objeto. A Serialize função tem um CArchive argumento que usa para ler e gravar os dados do objeto. O objeto CArchive tem uma função de membro, IsStoringque indica se Serialize está armazenando (gravando dados) ou carregando (lendo dados). Usando os resultados de IsStoring como guia, insira os CArchive dados do objeto no objeto com o operador de inserção (<<) ou extraia dados com o operador de extração (>>).
Considere uma classe derivada CObject e que tenha duas novas variáveis de membro, de tipos CString e WORD. O fragmento de declaração de classe a seguir mostra as novas variáveis de membro e a declaração para a função membro substituída Serialize :
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 Serializar
Chame sua versão de
Serializeclasse base para garantir que a parte herdada do objeto seja serializada.Insira ou extraia as variáveis de membro específicas para sua classe.
Os operadores de inserção e extração interagem com a classe de arquivo morto para ler e gravar os dados. O exemplo a seguir mostra como implementar
Serializepara aCPersonclasse 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 as funções de membro CArchive::Read e CArchive::Write para ler e gravar grandes quantidades de dados não tipados.
Usando a macro DECLARE_SERIAL
A macro DECLARE_SERIAL é necessária na declaração de classes que darão suporte à serialização, conforme mostrado aqui:
class CPerson : public CObject
{
public:
DECLARE_SERIAL(CPerson)
Definindo um construtor sem argumentos
O MFC requer um construtor padrão quando recria seus objetos à medida que são desserializados (carregados do disco). O processo de desserialização preencherá todas as variáveis de membro com os valores necessários para recriar o objeto.
Esse construtor pode ser declarado público, protegido ou privado. Se você torná-lo protegido ou privado, você ajuda a garantir que ele só será usado pelas funções de serialização. O construtor deve colocar o objeto em um estado que permita que ele seja excluído, se necessário.
Observação
Se você esquecer de definir um construtor sem argumentos em uma classe que usa as macros DECLARE_SERIAL e IMPLEMENT_SERIAL, receberá um aviso do compilador "nenhum construtor padrão disponível" na linha em que a macro IMPLEMENT_SERIAL é usada.
Usando a macro IMPLEMENT_SERIAL no arquivo de implementação
A macro IMPLEMENT_SERIAL é usada para definir as várias funções necessárias quando você deriva uma classe serializável de CObject. Use 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 de sua classe base imediata.
O terceiro argumento para essa macro é um número de esquema. O número do esquema é essencialmente um número de versão para objetos da classe. Use um inteiro maior ou igual a 0 para o número de esquema. (Não confunda esse número de esquema com a terminologia do banco de dados.)
O código de serialização MFC verifica o número do esquema ao ler objetos na memória. Se o número de esquema do objeto no disco não corresponder ao número de esquema da classe na memória, a biblioteca gerará um CArchiveException, impedindo que seu programa leia uma versão incorreta do objeto.
Se você quiser que a Serialize função membro seja capaz de ler várias versões, ou seja, arquivos gravados com versões diferentes do aplicativo, você pode usar o valor VERSIONABLE_SCHEMA como um argumento para a macro IMPLEMENT_SERIAL. Para obter informações de uso e um exemplo, consulte a GetObjectSchema função membro da classe CArchive.
O exemplo a seguir mostra como usar IMPLEMENT_SERIAL para uma classe, CPersonque é derivada de CObject:
IMPLEMENT_SERIAL(CPerson, CObject, 1)
Depois de ter uma classe serializável, você poderá serializar objetos da classe, conforme discutido no artigo Serialização: Serializando um objeto.