• vc++上的MFC的对象序列化和反序列化


    注意点:
     1. 必须类型序列化声明
        DECLARE_SERIAL( Person )
     
     2. 必须写出实现宏
     IMPLEMENT_SERIAL(Person, CObject, VERSIONABLE_SCHEMA | 2)
     
     3. 重写CObject中的Serialize函数
     void Person::Serialize( CArchive& ar )
     {
      CObject::Serialize(ar);
      //关键代码
      if(ar.IsStoring()) {
       //序列化
       ar << this->age << this->sex << this->name;
      } else {
       //反序列化
       ar >> this->age >> this->sex >> this->name;
      }
     }

    序列化后的数据


    //Person.h
    #pragma once
    #include <afx.h>
    #include <string>
    #include <atlstr.h>
    
    using namespace std;
    
    class Person: public CObject
    {
    private:
    	//注意MFC 不支持 标准std:string对象序列化, boost库支持std:string     
        CString name;
        int age;
        char sex;
    public:
        DECLARE_SERIAL( Person )
    
        Person(void);
    
        Person(CString name, int age, char sex);
    
        virtual ~Person(void);
    
        virtual void Serialize(CArchive& ar);
    
        void setName(CString pName);
    
        CString getName();
    
        void setAge(int age);
    
        int getAge();
    
        void setSex(char sex);
    
        char getSex();
    };
    
    //Person.cpp
    #include "StdAfx.h"
    #include "Person.h"
    #include <afx.h>
    #include <string>
    
    //必须写出实现宏
    IMPLEMENT_SERIAL(Person, CObject, VERSIONABLE_SCHEMA | 2)
    
    Person::Person(void)
    {
    }
    
    Person::Person( CString name, int age, char sex )
    {
        this->name = name;
        this->age = age;
        this->sex = sex;
    }
    
    Person::~Person(void)
    {
    }
    
    void Person::setName(  CString name)
    {
        this->name = name;
    }
    
    CString Person::getName()
    {
        return this->name;
    }
    
    void Person::setAge( int age )
    {
        this->age = age;
    }
    
    int Person::getAge()
    {
        return this->age;
    }
    
    void Person::setSex( char sex )
    {
        this->sex = sex;
    }
    
    char Person::getSex()
    {
        return this->sex;
    }
    
    void Person::Serialize( CArchive& ar )
    {
        CObject::Serialize(ar);
    	//关键代码
        if(ar.IsStoring()) {
    		//序列化
            ar << this->age << this->sex << this->name;
        } else {
    		//反序列化
            ar >> this->age >> this->sex >> this->name;
        }
    }
    
    // main.cpp : 定义控制台应用程序的入口点。
    #include "stdafx.h"
    #include <tchar.h>
    #include <afx.h>
    #include <iostream>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        Person person;
        person.setAge(20);
        person.setName("zhangsan");
        person.setSex('1');
    
        CFile myFile(_T("c:/person.ser"), CFile::modeCreate | CFile::modeReadWrite);
        // Create a storing archive.
        CArchive arStore(&myFile, CArchive::store);
    
        // Write the object to the archive
        arStore.WriteObject(&person);
    
        arStore.Flush();
        // Close the storing archive
        arStore.Close();
    
        // Create a loading archive.
        myFile.SeekToBegin();
        CArchive arLoad(&myFile, CArchive::load);
    
        // Verify the object is in the archive.
        Person* p = (Person*) arLoad.ReadObject(person.GetRuntimeClass());
        arLoad.Close();
    
        //wcout << "姓名:" << name.GetBuffer(name.GetLength()) << endl;
    
        CString name = p->getName();
        wchar_t* pch = name.GetBuffer(0);
        wcout << "姓名:" << pch << endl;
        name.ReleaseBuffer(); //注意内在释放
    
        cout << "性别:" << p->getSex() << endl;
        cout << "年龄:" << p->getAge() << endl;
    
        delete p;
        return 0;
    }


  • 相关阅读:
    《Java基础学习笔记》JAVA修饰符之私有化(Private)
    《Java基础学习笔记》JAVA之静态代码块
    《Java基础学习笔记》JAVA之构造函数和构造代码块
    《Java基础学习笔记》JAVA面向对象
    在C#.NET中,如何生成PDF文件?主要有以下几个途径:(转)
    ckeditor与ckfinder的使用方法 .NET (转载)
    ckeditor3.3.1编辑区自动换行(转)
    iTextSharp 使用详解(转)
    .net DataGrid绑定列手动添加数据
    操作必须使用一个可更新的查询
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318766.html
Copyright © 2020-2023  润新知