C++序列化模拟三 -----酒后日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 四级考试实在是郁闷于是,出去喝酒 ,今天喝酒喝多了,中午的时候解决了上次的BUG2 .... 浑身已经,麻木,,,,代码贴下,,我决定以对象序列化研究作为我的毕业设计,抽出一定时间研究最后整合.
四级考试实在是郁闷于是,出去喝酒 ,今天喝酒喝多了,中午的时候解决了上次的BUG2 ....
浑身已经,麻木,,,,代码贴下,,我决定以对象序列化研究作为我的毕业设计,抽出一定时间研究最后整合.昨天我的BUG2原因是由于没有对基类进行序列化 ////
关于BUG1的问题 设计到new 的内存分配机制以及对内存的映射问题// ,下次在研究今天实在敲不动代码了 喝了三大扎扎啤睡觉了....../////
BUG1解决方案如下
ObjectSerialize.h  头文件
#include <iostream>
#include <fstream>
#include <string>
using  namespace std ;
#ifndef _ONE
#define _ONE
class Base  //基类做一些统一的操作

 
};
class ObjectSerialize
{
public:
/*  Base类型提供了统一的实现 ,所有需要序列化的类必须继承自Base类 包括成员对象
*   LoadObject  LoadObject 在这里不需要多态机制 单独作为功能的实现
*   length 为对象的实际长度 为了避免在内存重分配过多的内存浪费空间
*   long length=sizeof(*obj) ;  //不可以这样做因为 我们发现实际上sizeof这个运算符
*    在操作的时候获取的是当前运行时类型所指对象的大小 如果向上转型那么会进行窄化处理 获得的大小是1 所以这里要传递实际大小
*   LoadObject  LoadObject作为Base的静态方法分别提供序列化和反序列化的功能
 */
    static void StoreObject(Base *obj,string file,int length)   ;
    static Base* LoadObject(string file,int length)  ;
    ObjectSerialize() ;
private:
/*
*  暂存加载的对象,对于同一个对象无论LoadObject多少次 加载的永远只是
*  返回的同一份内存即同一个对象,直到这个对象的声明周期完毕,那么再次加载会是不同的对象
 */
 static Base *tem_object;
}  ;
#endif
ObjectSerialize.cpp内容如下
#include "ObjectSerialize.h"
void ObjectSerialize::StoreObject(Base *obj,string file,int length)  
{  
 cout<<"对象写入到文件..."<<endl ;
 ofstream *o=new ofstream(file.c_str()) ;
 o->write((char*)obj,length) ;
 o->close() ;
 delete o ;
}
Base* ObjectSerialize::LoadObject(string file,int length) 
{
 cout<<"从文件恢复对象..."<<endl ;
    if(ObjectSerialize::tem_object!=NULL)
     return ObjectSerialize::tem_object ;
    char *buf=new char[length] ;
    ifstream i(file.c_str()) ;
    i>>buf ;
    Base *p=(Base*)buf ;
    ObjectSerialize::tem_object=p ;
    i.close() ;
    return (p);
}
ObjectSerialize::ObjectSerialize()
{
 delete ObjectSerialize::tem_object ;
 ObjectSerialize::tem_object=NULL ;
}
Base* ObjectSerialize::tem_object=NULL; 
 //对于静态成员我们不能在一个文件中定义 否则将会导致重复定义
//我们需要在源文件中实现
 
///main所在的文件代码如下
#include "ObjectSerialize.h"
class Data  :public Base
{   
private :
 int data ;
public:
    Data(int x)
    {  
     cout<<"Data构造中..."<<endl ;
     this->data=x;
    }
    void OutPut()
    {
     cout<<"Data.data="<<this->data<<endl ;
    }
} ;
//序列化类MyObject
class MyObject :public Base
{
public :
 MyObject(int x)
 {  
  cout<<"MyObject 构造中.."<<endl;
  this->x=x ;
    y=8 ;
  
 }
 ~MyObject()
 {
 }
 
 MyObject ShowX()  //一段最简单的代码
 {
  cout<<"x="<<x<<endl ;
  cout<<"y="<<y<<endl ;
  return (*this) ;
 }
 
private :
 int x ;
 int y ;
}  ;

struct X :public Base

 int a;
 int b;
 int c;
 
} ;
int main()
{  
    string file1="c:\\data.txt" ;
    string file2="c:\\myobject.txt" ;
 int len1=sizeof(Data) ;
 int len2=sizeof(MyObject) ;
 //  Data *d=new Data(432);
 //   ObjectSerialize::StoreObject(d,file1,len1) ;
// MyObject *obj=new MyObject(4333) ;
// ObjectSerialize::StoreObject(obj,file2,len2) ;
 //((Data*)ObjectSerialize::LoadObject(file1,len1))->OutPut() ;
 ((Data*)ObjectSerialize::LoadObject(file2,len2))->OutPut()  ;
 return 0 ;
}
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
编译器 vr&ar C语言
高效c/c++日志工具zlog使用介绍
高效c/c++日志工具zlog使用介绍
814 2
|
11月前
|
缓存 Linux 编译器
【C++】CentOS环境搭建-安装log4cplus日志组件包及报错解决方案
通过上述步骤,您应该能够在CentOS环境中成功安装并使用log4cplus日志组件。面对任何安装或使用过程中出现的问题,仔细检查错误信息,对照提供的解决方案进行调整,通常都能找到合适的解决之道。log4cplus的强大功能将为您的项目提供灵活、高效的日志管理方案,助力软件开发与维护。
373 0
|
12月前
|
存储 运维 监控
超级好用的C++实用库之日志类
超级好用的C++实用库之日志类
159 0
|
JSON Java Linux
【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )
【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )
212 2
|
监控 C++
c++实战篇(二)——基于自旋锁实现的日志服务模块
c++实战篇(二)——基于自旋锁实现的日志服务模块
118 0
|
C++
C++11日志之spdlog
C++11日志之spdlog
240 1
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
76 0
|
3月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
158 0