C++序列化使用
error C2248 无法访问私有成员 :原因 ifstream 作为参数必须传引用!
(1):C++使用STL序列化:原文链接:http://blog.csdn.net/pandaxcl/article/details/649682
在用C++编写应用程序的过程中,经常涉及到序列化的问题,但是序列化的问题通常都
会有非常繁琐的过程代码需要书写,本文中就是通过简单的步骤实现了程序的序列化问题
,简单直接,和其它的序列化方案有着很大的不同。 首先来看看简单的数据写入文件和从文件读入数据的代码: 特别注解:本人特别喜欢用STL来书写代码,一方面是便于移植,但是另一方却是在于
用STL书写的代码简单直接,可读性好。如果还不熟悉STL,本文则不大适合你:)
#endif
#if CODE1
////////////////////////////////////////////////////////////////////////////////
//模拟程序序列化的简单代码
#include <iostream>//cout
#include <fstream>//ofstream,ifstream
#include <vector>//vector
#include <iterator>//ostream_iterator,istream_iterator,back_inserter
#include <numeric>//partial_sum
#include <algorithm>//copy
#include <string>
#include <sstream>
using namespace std;//简化代码的书写,经std名字空间成为默认名字空间
int main()
{
{//从程序序列化到文件
vector<int> v(5,1);//[1,1,1,1,1]
partial_sum(v.begin(),v.end(),v.begin());//[1,2,3,4,5]
ofstream out("data.txt");//生成文件输出流
//将数组v中的数据全部输出到文件流中,这种操作在C++中成为文件操作
//在这里暂时称为序列化到文件操作。实际上这里为了简单序列化的格式
//为文本文件格式。如果需要其它的格式完全可以通过自定义输出流游标
//的方式,或者重载运算符operator<<和operator>>实现不同的序列化格
//式。可以参见本人的其它相关文档。
copy(v.begin(),v.end(),ostream_iterator<int>(out," "));
}
{//从文件序列化到程序
vector<int> v;//模拟应用程序中数据
ifstream in("data.txt");//建立输入流
//下面的这行代码从文件中提取数据到v中,模拟了应用程序的序列化过程
copy(istream_iterator<int>(in),istream_iterator<int>(),back_inserter(v));
//下面的这行代码仅仅只是为了显示是否真的被序列化到了程序中
copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////
//该程序的输出如下:
/*******************************************************************************
1 2 3 4 5
*******************************************************************************/
//data.txt中的内容如下:
/*******************************************************************************
1 2 3 4 5
*******************************************************************************/
////////////////////////////////////////////////////////////////////////////////
#endif//CODE1
(2):第二种方式:使用POST++ 类库
信息科技第一门户:
原文链接:http://www.atcto.net/Tech/C/2012-10-10/C,12101014524800000002.html
C++精彩博客系列:http://blog.chinaunix.net/topic/Cjishu/
(3) Boost.Serialization
链接介绍:http://zh.highscore.de/cpp/boost/serialization.html
轻量序列化介绍:http://blog.csdn.net/fhxpp_27/article/details/8556948
Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。该库具有以下吸引人的特性:
- 代码可移植(实现仅依赖于ANSI C++)。
- 深度指针保存与恢复。
- 可以序列化STL容器和其他常用模版库。
- 数据可移植。
- 非入侵性。
原文链接:http://www.cnblogs.com/lanxuezaipiao/p/3703988.html
(4):使用MessagePack进行序列化
原文链接:http://www.tuicool.com/articles/qMrayai
msgpack官方主页:http://msgpack.org/
github主页:https://github.com/msgpack/msgpack
序列化自定义类型:msgpack已支持了很多的标准类型,但有时我们会自己定义新的类型,这时,我们必须对新类型做某些修改,以使msgpack可以操作它。
另外,如果你的类型中含有低层指针,则还需要进行一些处理,否则,msgpack只会进行浅拷贝,无法序列化指针所指向的内存数据。
假设我们原本的类型如下:
struct Foo
{
int i;
string str;
char* data;
};
那么要让msgpack操作它,应修改为如下结构:
struct Foo
{
int i;
string str;
// 原始指针类型,内部封装了pack_raw和pack_raw_body方法
msgpack::type::raw_ref data; MSGPACK_DEFINE(i, str, data);
}; 1 /*
2 * msgpack C++试验:序列化/反序列化自定义数据结构.
3 * Author: 赵子清
4 * Blog: http://www.cnblogs.com/zzqcn
5 * */
6
7
8 #include <msgpack.hpp>
9 #include <string>
10 #include <cstring>
11 #include <iostream>
12 using namespace std;
13
14
15 struct Foo
16 {
17 int i;
18 string str;
19 // 原始指针类型,内部封装了pack_raw和pack_raw_body方法
20 msgpack::type::raw_ref data;
21
22 MSGPACK_DEFINE(i, str, data);
23 };
24
25
26 int main(int argc, char** argv)
27 {
28 Foo f;
29 f.i = 4;
30 f.str = "hello world";
31 const char* tmp = "msgpack";
32 f.data.ptr = tmp;
33 f.data.size = strlen(tmp) + 1;
34
35 msgpack::sbuffer sbuf;
36 msgpack::pack(sbuf, f);
37
38 msgpack::unpacked unpack;
39 msgpack::unpack(&unpack, sbuf.data(), sbuf.size());
40
41 msgpack::object obj = unpack.get();
42
43 Foo f2;
44 obj.convert(&f2);
45
46 cout << f2.i << ", " << f2.str << ", ";
47 cout << f2.data.ptr << endl;
48
49 return 0;
50 }
输出结果:
4, hello world, msgpack
(5):自己编写序列化代码
由于C++库的开放性差,弹性小,不能用于自己的结构体map,最后还是自己专门为自己的结构体写了序列化代码
C++序列化使用的更多相关文章
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
- 【.net 深呼吸】设置序列化中的最大数据量
欢迎收看本期的<老周吹牛>节目,由于剧组严重缺钱,故本节目无视频无声音.好,先看下面一个类声明. [DataContract] public class DemoObject { [Dat ...
- 用dubbo时遇到的一个序列化的坑
首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...
- Unity 序列化
Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...
- Unity 序列化 总结
查找了 Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http:// ...
- [C#] C# 知识回顾 - 序列化
C# 知识回顾 - 序列化 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902005.html 目录 序列化的含义 通过序列化保存对象数据 众 ...
- Newtonsoft.Json设置类的属性不序列化
参考页面: http://www.yuanjiaocheng.net/webapi/parameter-binding.html http://www.yuanjiaocheng.net/webapi ...
- C# 序列化与反序列化几种格式的转换
这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...
- Netty实现高性能RPC服务器优化篇之消息序列化
在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...
- .Net深入实战系列—JSON序列化那点事儿
序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...
随机推荐
- 【剑指Offer】61、序列化二叉树
题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树. 解题思路: 序列化是指将结构化的对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程.反序列化是指将字节流转回结构 ...
- [luogu4158 SCOI2009] 粉刷匠(dp)
传送门 Solution 把状态都记上暴力转移即可 Code //By Menteur_Hxy #include <queue> #include <cmath> #inclu ...
- daemon not running; starting now at tcp:5037 adb: CreateFileW 'nul' failed: 系统找不到指定的文件
1. INFO - roid.tools.idea.adb.AdbService - Initializing adb using: C:\Users\Administrator\AppData\Lo ...
- 教你 Shiro + SpringBoot 整合 JWT
本篇文章将教大家在 shiro + springBoot 的基础上整合 JWT (JSON Web Token) 如果对 shiro 如何整合 springBoot 还不了解的可以先去看我的上一篇文章 ...
- nyoj 711 枚举+并查集
#include<stdio.h>//从大到小不断枚举边直到找到s-t的路径,判断从s可以到t可以用并查集来判断 #include<stdlib.h>//枚举最大的一条边肯定 ...
- Java 中 synchronized的用法详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之 ...
- [bzoj2466][中山市选2009]树_树形dp
树 bzoj-2466 中山市选-2009 题目大意:给定一棵树,每一个点有一个按钮和一个灯泡.如果按下一个点的按钮那么和这个点直接相连的点包括这个点的灯泡的状态会改变.如果是点亮就会变成熄灭,如果 ...
- 洛谷 P1463 [SDOI2005]反素数ant
P1463 [SDOI2005]反素数ant 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i< ...
- Linux文件查找命令find(转)
Linux find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子目录 ...
- Git的基本设置
进入虚拟机环境中:首先我们对 Git 进行用户名和邮箱进行设置,请参照下面格式,替换为你自己常用的用户名和邮箱来完成设置: $ git config --global user.name " ...