c++ - Boost C++ 跨平台 (Windows & Mac) std::wstring 序列化

标签 c++ serialization boost wofstream

我正在为 Windows(使用 Visual Studio 2008)和 Mac(使用 GCC)构建的程序中使用 Boost C++ 库实现序列化。该程序在大约 30 个类中使用宽字符串 (std::wstring)。根据平台的不同,当我保存到文件时(通过 boost::archive::text_woarchive),宽字符串在输出文件中的表示方式不同。

Windows 下保存:

H*e*l*l*o* *W*o*r*l*d*!* ...

MacOSX 下保存:

H***e***l***l***o*** ***W***o***r***l***d***!*** ...

其中 * 是 NULL 字符。

当我尝试使用 Mac 构建读取在 Windows 下创建的文件时(反之亦然),我的程序崩溃了。

据我目前的理解,Windows native 使用每个宽字符 2 个字节,而 MacOSX(我想一般是 Unix)使用 4 个字节。

我遇到过可能的解决方案,例如 utf8_codecvt_facet.cppUTF8-CPP , ICU , 和 Dinkumware ,但是我还没有看到一个例子可以与我已有的东西一起工作(例如,我不希望此时重写五个月的序列化工作):

std::wofstream ofs( "myOutputFile" );
boost::archive::text_woarchive oa( ... );
//... what do I put here? ...
oa << myMainClass;

myMainClass 包含宽字符串和指向其他类的 Boost 智能指针,这些类依次被序列化。

最佳答案

wofstreamtypedef basic_ofstream<wchar_t, char_traits<wchar_t> > wofstream;

在 Linux 上,您需要声明一个自定义 ofstream处理 16 位字符(在 Linux 上)。 这可以按如下方式完成:

typedef std::uint16_t Char16_t;
typedef basic_ofstream<Char16_t, char_traits<Char16_t> > wofstream_16;

现在wofstream_16可以在不同平台上无缝使用以处理 16 位宽的字符。

关于c++ - Boost C++ 跨平台 (Windows & Mac) std::wstring 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8481348/

相关文章:

c++ - 在asio spawn调用中 boost 与成员函数的绑定(bind)

C++ 指向其他类函数的指针函数

json - 使用 json4s 序列化 AnyVal 的序列

尽管使用指针将其初始化为一维,但 C++ 仍将数组用作多维

python - Django DRY 模型/表单/序列化程序验证

MySQL更新序列化数据

c++ - C++ 11中的boost::thread_group?

c++ - Boost::signals2::signal::connect 的原型(prototype)是什么

C++ While循环检查最新的输入int

c++ - 什么是复制省略和返回值优化?