MFC - CArchive/内存之间的序列化应用细节

文章目录

    • MFC - CArchive/内存之间的序列化应用细节
    • 概述
    • 笔记
    • END

MFC - CArchive/内存之间的序列化应用细节

概述

有个参数文件, 开始直接序列化到文件.
现在优化程序, 不想这个参数文件被用户看到.
想先由参数发布程序(自己用)设置好参数后, 加个密落地.
等用户拿到后, 由程序导入到程序运行时指定的数据目录.
程序运行时, 先解密参数文件到内存, 然后再由MFC序列化到类中的变量.
查了一下, 有大神出了文章(https://www.codeproject.com/Articles/1176939/All-About-MFC-Serialization), 将MFC序列化的各种细节都讲了.

不过有些细节要自己实验才能确定. e.g. CArchive向流中序列化写入不同的内容, 这个流空间需要开多长?
针对流的序列化, 自己做了实验, 用到的实现细节都测试了.
可以在自己工程中应用(CArchive/流之间的序列化)了.

笔记


void buf_save_to_ar(uint8_t* pBuf, UINT lenBuf)
{bool b_rc = false;CMemFile memFile;uint64_t lenFile = 0;do {if ((NULL == pBuf) || (0 == lenBuf)){break;}// memFile.Close(); // @todo for test, 没有attch的时候, 也不会报错.// lenFile = memFile.GetLength(); // 0 , 没有attach的时候, 或者关闭后, 不报错, 返回的文件长度为0memFile.Attach(pBuf, lenBuf);// lenFile = memFile.GetLength(); // 0x100, Attach Buffer后, 文件长度就是Buffer的长度CArchive ar(&memFile, CArchive::store);//ar << CString(_T("1")); // 如果buffer长度不足, 也不报错, 看来要将buffer长度给够 ff fe ff 01 31 00//ar.Flush(); // for test//ar << CString(_T("12")); // 如果buffer长度不足, 也不报错, 看来要将buffer长度给够 ff fe ff 02 31 00 32 00//ar.Flush(); // for test//ar << CString(_T("1"));//ar.Flush(); // ff fe ff 01 31 00//ar << CString(_T("2")); ff fe ff 01 31 00 ff fe ff 01 32 00//ar.Flush(); // for testar << CString(_T("hello")); // 如果buffer长度不足, 也不报错, 看来要将buffer长度给够// ff fe ff 05 68 00 65 00 6c 00 6c 00 6f 00 ar.Flush(); // for test// lenFile = ar.GetFile()->GetLength(); // 这个长度和序列化无关, 就是attach的buffer长度ar << CString(_T("world"));ar.Flush(); // for testtry {// 如果buffer给的长度不够, 关闭ar时会报错// catch不住// 所以buffer要留够, 给序列化内容长度估算的1.1倍数, 可能靠谱一些ar.Close(); //  ff fe ff 05 68 00 65 00 6c 00 6c 00 6f 00 ff fe ff 05 77 00 6f 00 72 00 6c 00 64 00 ed ed fd fd fd fd // 可以看到留出的保险字符位置并没有被覆盖}catch (CArchiveException* e){e->IsSerializable();b_rc = false;break;}b_rc = true;} while (false);_ASSERT(b_rc);memFile.Close();
}void ar_load_from_ar(uint8_t* pBuf, UINT lenBuf)
{bool b_rc = false;CMemFile memFile;CString csHello;CString csWorld;do {if ((NULL == pBuf) || (0 == lenBuf)){break;}memFile.Attach(pBuf, lenBuf);CArchive ar(&memFile, CArchive::load);ar >> csHello;// now csHello is _T("hello")ar >> csWorld;// now csWorld is _T("world")ar.Close();b_rc = true;} while (false);_ASSERT(b_rc);memFile.Close();
}void CTestArBufDlg::OnBnClickedButton1()
{uint8_t* pBuf = NULL;UINT lenBuf = 0; // 根据要写入的内容多少, 估算好长度后, 来开bufferCString csTmp;int iLenTmp = 0;int i = 0;int iCntCString = 0; // 假设要序列化的是下面这2个CString// CString(_T("hello"))// CString(_T("world"))csTmp = _T("hello");iCntCString++;iLenTmp = csTmp.GetLength(); // 5lenBuf += iLenTmp;csTmp = _T("world");iCntCString++;iLenTmp = csTmp.GetLength(); // 5lenBuf += iLenTmp;// ff fe ff 01 31 00// 每次ar一次CString, 就需要增加4个字节(0xff, 0xfe, 0xff 可能是CString的类标记(以后遇到机会, 可以再试试别的数据类型), 01 代表CString的TCHAR字符数量)// lenBuf 现在是WCHAR的数量, 要转成uint8_t的数量lenBuf = lenBuf * sizeof(TCHAR);lenBuf += (iCntCString * 4); // 存一次CString, 就有4个字节的头信息lenBuf += sizeof(TCHAR); // 留个保险字节的位置// now lenBuf is 0x16// 开bufferpBuf = new uint8_t[lenBuf];_ASSERT(NULL != pBuf);// 自己的内存调试标记可以为0xED. MFC调试标记为0xCD, 0xFD, 0xDDmemset(pBuf, 0xED, lenBuf);// test use CArchive load-from/save-to buffer// 如果向流中进行序列化写入, 则需要考虑开多大的流空间, 否则报错(catch不住)buf_save_to_ar(pBuf, lenBuf);// 如果是从流中载入序列化, 则不需要考虑buffer的长度, 因为这个buffer是已经确定的, 正确的(由前面的序列化写入保证)ar_load_from_ar(pBuf, lenBuf);// all ok
}

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/590629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习笔记 - 什么是匈牙利算法?有什么用处?

一、什么是匈牙利算法? 匈牙利算法是一种优化算法,可以在多项式时间内解决分配问题。该算法也被称为Kuhn-Munkres 算法或Munkres 分配算法。 匈牙利算法由以下四个步骤组成。 前两个步骤执行一次,而步骤 3 和 4 则重复执行,直到找到最佳分配。该算法的输入是一个仅包含非负…

layui的表单中的一些常见的标签的含义,含在线实战。

表单提交&#xff1a; lay-submit和lay-filter组合使用实现表单的提交,注意这个必须有两个&#xff0c;不然实现不了表单的提交喔&#xff0c;例如 <button class"layui-btn layui-btn-normal" lay-filter"login_button" lay-submit"">登…

在线智能防雷监控检测系统应用方案

在线智能防雷监控检测系统是一种利用现代信息技术&#xff0c;对防雷设施的运行状态进行实时监测、管理和控制的系统&#xff0c;它可以有效提高防雷保护的安全性、可靠性和智能化程度&#xff0c;降低运维成本和风险&#xff0c;为用户提供全方位的防雷解决方案。 地凯科技在…

什么是数据标注

数据标注&#xff08;Data Annotation&#xff09;是指将原始数据中的特定信息或标签添加到数据样本中的过程。这些标签通常是人类专家或者自动化工具根据特定任务或问题的需求来添加的。数据标注的目的是为了让机器学习算法能够理解和利用数据&#xff0c;从而进行模型训练、预…

排序算法之计数排序

计数排序是一种非基于比较的排序算法&#xff0c;它通过统计数组中每个元素出现的次数&#xff0c;将其按次数从小到大排序。 以下是计数排序的基本步骤&#xff1a; 统计&#xff1a;统计数组中每个元素出现的次数。计数&#xff1a;将每个元素的出现次数存储在另一个数组中…

redisson作为分布式锁的底层实现

1. redisson如何实现尝试获取锁的逻辑 如何实现在一段的时间内不断的尝试获取锁 其实就是搞了个while循环&#xff0c;不断的去尝试获取锁资源。但是因为latch的存在会在给定的时间内处于休眠状态。这个事件&#xff0c;监听的是解锁动作&#xff0c;如果解锁动作发生。会调用…

Android textview展示富文本内容

今天实现的内容&#xff0c;就是上图的效果&#xff0c;通过Span方式展示图片&#xff0c;需要支持文字颜色改变、加粗。支持style\"color:green; font-weight:bold;\"展示。尤其style标签中的font-size、font-weight是在原生中不被支持的。 所以我们今天需要使用自…

病情聊天机器人,利用Neo4j图数据库和Elasticsearch全文搜索引擎相结合

项目设计目的&#xff1a; 本项目旨在开发一个病情聊天机器人&#xff0c;利用Neo4j图数据库和Elasticsearch全文搜索引擎相结合&#xff0c;实现对病情相关数据的存储、查询和自动回答。通过与用户的交互&#xff0c;机器人可以根据用户提供的症状描述&#xff0c;给出初步的可…

字母简化(UPC练习)

题目描述 给出一串全部为小写英文字母的字符串&#xff0c;要求把这串字母简化。简化规则是&#xff1a;统计连续出现的字母数&#xff0c;输出时先输出个数&#xff0c;再输出字母。比如&#xff1a;aaabbbaa&#xff0c;则简化为3a3b2a&#xff1b;而zzzzeeeeea&#xff0c;…

机器学习一些概念

LDA&#xff1a;LDA最大化类间距离&#xff0c;最小化类内距离&#xff0c;使得投影后的不同类别的样本分的更开&#xff0c;属于监督学习。 PCA&#xff1a;PCA最小重构误差&#xff0c;使得投影后的值和原来的值尽量接近&#xff0c;属于非监督学习。 SVM&#xff1a;最大间…

帆软报表中定时调度中的最后一步如何增加新的处理方式

在定时调度中,到调度执行完之后,我们可能想做一些别的事情,当自带的处理方式不满足时,可以自定义自己的处理方式。 产品的处理方式一共有如下这些类型: 我们想在除了上面的处理方式之外增加自己的处理方式应该怎么做呢? 先看下效果: 涉及到两方面的改造,前端与后端。…

前端算法之二叉树

二叉树 二叉树用于解决什么问题 数据的组织与搜索&#xff1a;排序&#xff1a;表达式和计算&#xff1a;图形处理&#xff1a; 举例&#xff1a;二叉树的最近公共祖先 思路&#xff1a; 排序/排布方式 和 &#xff08;排序中&#xff09;当前树和节点的关系 举例2&#xff1a;…

光照贴图的参数化

正如Jon在上一篇文章中所解释的那样&#xff0c;我们在《见证者》中使用了预先计算的全局照明&#xff0c;而我的首要任务之一就是开发该系统。 我开发了一些有趣的技术来计算自动参数化&#xff0c;以一种可以轻松映射到 GPU 的方式制定照明计算&#xff0c;并通过使用辐照度…

【如何选择Mysql服务器的CPU核数及内存大小】

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

Codeium在IDEA里的3个坑

转载自Codeium在IDEA里的3个坑&#xff1a;无法log in&#xff0c;downloading language server和中文乱码_downloading codeium language server...-CSDN博客文章浏览阅读1.7w次&#xff0c;点赞26次&#xff0c;收藏47次。Codeium安装IDEA插件的3个常见坑_downloading codeiu…

Nginx配置压缩和解压缩

压缩服务器响应&#xff0c;或为不支持压缩的客户端解压缩它们&#xff0c;以提高传递速度并减少服务器开销。 压缩响应通常会显著减小传输数据的大小。但是&#xff0c;由于压缩发生在运行时&#xff0c;因此它也会增加相当大的处理开销&#xff0c;从而对性能产生负面影响。…

4-2. AOP细节

1 AOP细节 1.1 切入点表达式 1.1.1 作用 通过表达式的方式定位一个或多个具体的连接点。 1.1.2 语法细节 1&#xff09;切入点表达式的语法格式 execution([权限修饰符] [返回值类型] [简单类名/全类名] 方法名) 2) 举例说明 3&#xff09;在AspectJ中&#xff0c;切入…

通过国家网络风险管理方法提供安全的网络环境

印度尼西亚通过讨论网络安全法草案启动了其战略举措。不过&#xff0c;政府和议会尚未就该法案的多项内容达成一致。另一方面&#xff0c;制定战略性、全面的网络安全方法的紧迫性从未像今天这样重要。 其政府官方网站遭受了多起网络攻击&#xff0c;引发了人们对国家网络安全…

小肥柴慢慢手写数据结构(C篇)(5-2 AVL树)

小肥柴慢慢学习数据结构笔记&#xff08;C篇&#xff09;&#xff08;5-2 AVL树 目录5-5 AVL出现的原因5-5-1 平衡树5-5-2 平衡二叉树的具体案例 5-6 AVL平衡策略的讨论5-7 不使用平衡因子的实现&#xff08;黑皮书&#xff0c;训练思维&#xff09;5-8 使用平衡因子的实现&…

C++ 编程必备:对象生命周期管理的最佳实践

在C中&#xff0c;对象的生命周期是指对象存在的时间段&#xff0c;从对象创建到对象销毁的整个过程。正确地管理对象的生命周期是编写高效、可靠C代码的关键之一 对象的创建 在C中&#xff0c;对象可以通过三种方式创建&#xff1a;静态分配、自动分配和动态分配。 静态分配…