每当我发现自己需要在C++程序中序列化对象时,我就会回到这种模式:
class Serializable {
public:
static Serializable *deserialize(istream &is) {
int id;
is >> id;
switch(id) {
case EXAMPLE_ID:
return new ExampleClass(is);
//...
}
}
void serialize(ostream &os) {
os << getClassID();
serializeMe(os);
}
protected:
int getClassID()=0;
void serializeMe(ostream &os)=0;
};
Run Code Online (Sandbox Code Playgroud)
以上在实践中效果很好.但是,我听说这种类ID转换是邪恶的,反模式; 什么是在C++中处理序列化的标准OO方式?
我知道Java或C#似乎太多了.但是,将我自己的类作为函数的输入有效是否可行/好/明智std::to_string?例:
class my_class{
public:
std::string give_me_a_string_of_you() const{
return "I am " + std::to_string(i);
}
int i;
};
void main(){
my_class my_object;
std::cout<< std::to_string(my_object);
}
Run Code Online (Sandbox Code Playgroud)
如果没有这样的东西(我认为那样),最好的办法是什么?
可能重复:
如何在c ++中序列化?
如何在C++中实现序列化
这些天我越来越多地使用C++,并且此时只有一些关于ofstream的经验.大多数所述经验都是对变量进行简单的文件输出,并使用ifstream将其读回.我没做过的是任何有物体的东西.
让我们假设我有一个经常被写入的对象(比如游戏,对象就是角色)每次击中角色时,每次击败他们获得经验的敌人时,都会重新编写hp. ...我的基本想法是编写一个简单的基于文本的地下城爬行游戏.但是我如何制作某种自动保存文件?我是否只是将对象的每个属性单独写入文件,然后从那里移到更大更好的位置?如果我现在必须这样做,那就是我要去做的事情,但是我不禁感到有一种比这更简单的方式....
有人帮我把整个对象的内容(以及它各自的属性)输出到文件中吗?
如何将C++中的结构内容写入文本文件?我想要做的是,比如我有一个名为A的结构,数据成员是A.one,A.two等等,我想逐行将它们写成文本文件,就像这样
结构A
A.one =值
A.two =值...
结构B
B.one =值
B.two =值
基本上我想要转储..有一个简单的方法来做到这一点?什么是最好的I/O方法?CFile的?iostream的?谢谢..是否有更简单的方法来转储类的成员数据的所有值?
编辑:废话,谢谢你们..
我正在寻找一种简单的方法将C++中的对象转换为XML字符串表示,这样我就可以与服务器进行通信.
例如,让我们说我有一个对象:
class A{
string data1;
string data2;
string dataN;
list<B> bList;
}
class B{
string moreData;
}
Run Code Online (Sandbox Code Playgroud)
我想要以下XML表示:(假设我创建了一个实例A,它有两个B实例)
<A>
<data1>content</data1>
<data2>content</data2>
<dataN>content</dataN>
<B>
<moreData>content</moreData>
</B>
<B>
<moreData>content</moreData>
</B>
</A>
Run Code Online (Sandbox Code Playgroud) 我正在开发一个大量使用静态多态性的项目。我感兴趣的一个特定用例可以通过静态反射来实现,但我们在 C++ 中仍然没有这种功能。用例看起来像这样:我有一个函数可以从二进制文件读取/写入数据结构:
template <typename data_t> void write_binary(const my_type_t<data_t>& obj)
{
//write a binary file...
}
template <typename data_t> void read_binary(my_type_t<data_t>& obj)
{
//read a binary file...
}
Run Code Online (Sandbox Code Playgroud)
我想强制我只能从相同类型输出的文件中读取数据,例如my_type_t<std::string>只能从 等输出的二进制文件中读取数据my_type_t<std::string>。我想要执行此操作的方法是向二进制文件添加一个小标头确定了 的专业化data_t:
template <typename data_t> void write_binary(const my_type_t<data_t>& obj)
{
//write header type_name(data_t)
//write a binary file...
}
template <typename data_t> void read_binary(my_type_t<data_t>& obj)
{
//read header
//assert header == type_name(data_t)
//read a binary file...
}
Run Code Online (Sandbox Code Playgroud)
我知道它的存在typeid(data_t).name()以及分解它的各种方法,但我想要由标准定义的东西。
所以我的确切问题是:对于任何两种类型type1_t和type2_t,是否存在任何 …
长话短说
我有一个不仅仅是成员变量(例如它们包含函数)的结构,我只想将成员变量转换为字节数组(/向量),这样我就可以将数据上传到Vulkan中的显卡。如何仅获取结构体中代表成员变量的部分?
我的具体做法
我有一个设置,我使用一个空ParamsBase结构,并从中继承ParamsA,ParamsB...实际包含成员变量的结构。我使用它,这样我就可以将成员保留ParamsBase在一个Container类中,而无需实际了解具体实现。
我想将类中的 Params 实例转换Container为字节缓冲区。
ParamsA由于我需要实际/ /... 结构的大小ParamsB,因此在创建实例时我使用了一个通用子类,该子类允许我使用单个getSize()函数,而不是在每个 substruct 中覆盖它。
// =============================
// === Define Params structs ===
// =============================
struct ParamsBase
{
virtual size_t getSize() const noexcept = 0;
};
struct ParamsA : public ParamsBase
{
float vec[3] = { 2.3f, 3.4f, 4.5f };
};
// ===============================================================
// === enable sizeof query for derived structs from ParamsBase === …Run Code Online (Sandbox Code Playgroud) 我们知道c ++也是一种面向对象的编程语言,其中大多数东西都是像java这样的对象.所以想知道Serialize和deserializ功能是否可以在c ++中使用,我们在java中也可以使用?
如果是,如何实现?
在java中我们使用Serializable接口来说明这种类型的对象可以被序列化和反序列化.
那么在c ++中如何?
出于好奇,它在c#和java中一样吗?
我有"工厂"设计模式实现的以下代码.
class Pen{
public:
virtual void Draw() = 0;
};
class RedPen : public Pen{
public:
virtual void Draw(){
cout << "Drawing with red pen" << endl;
}
};
class BluePen : public Pen{
public:
virtual void Draw(){
cout << "Drawing with blue pen" << endl;
}
};
auto_ptr<Pen> createPen(const std::string color){
if(color == "red")
return auto_ptr<Pen>(new RedPen);
else if(color == "blue")
return auto_ptr<Pen>(new BluePen);
}
Run Code Online (Sandbox Code Playgroud)
但我听说可以使用"C++模板"以更好的方式完成.任何人都可以帮助它如何完成以及模板方法如何比这更好?
有什么想法吗
在我目前的项目中,我有一些不同的接口,要求我将消息序列化为字节缓冲区.我觉得我可能不会这样做会让一个真正的C++程序员感到高兴(我想).
我通常会这样做:
struct MyStruct {
uint32_t x;
uint64_t y;
uint8_t z[80];
};
uint8_t* serialize(const MyStruct& s) {
uint8_t* buffer = new uint8_t[sizeof(s)];
uint8_t* temp = buffer;
memcpy(temp, &s.x, sizeof(s.x));
temp += sizeof(s.x);
//would also have put in network byte order...
... etc ...
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
请原谅任何错别字,这只是我头脑中的一个例子.如果我正在序列化的结构有内部指针,显然它会变得更复杂.
所以,我有两个密切相关的问题:
上面的特定场景中是否存在任何问题,通过将结构直接转换为char缓冲区进行序列化,假设我知道目标系统具有相同的字节顺序?
主要问题:有没有更好的......呃...... C++?除了添加智能指针之外,还能做到这一点吗?我觉得这是一个常见的问题,STL可能会处理它 - 如果没有,我相信无论如何使用C++机制都有更好的方法.
如果您可以使用标准C++/STL更好地序列化此结构,而不添加库,那么编辑奖励积分.
直接赋值(即 =)与转换内容相同char*,然后使用for循环来逐字节复制它吗?*
我想知道一种方法是否优于另一种方法.
struct A
{
int a;
int b;
} Test;
void* Buffer = malloc(1024);
// Casting and byte copying
for (int i=0; i != 8; i++)
{
((char*)Buffer)[i] = ((char*)Test)[i];
}
// Assignment
((A*)Buffer)[0] = Test;
Run Code Online (Sandbox Code Playgroud)
*所有类型都是按位可复制的.
编辑:根据答案,memcopy与'='相同