相关疑难解决方法(0)

如何在C++中实现序列化

每当我发现自己需要在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方式?

c++ serialization design-patterns

28
推荐指数
5
解决办法
3万
查看次数

创建用户定义的类std :: to_string(able)

我知道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++ string tostring c++11

28
推荐指数
3
解决办法
1万
查看次数

9
推荐指数
3
解决办法
6636
查看次数

C++将一个对象写入一个文件,然后再将其读入?

可能重复:
如何在c ++中序列化?
如何在C++中实现序列化

这些天我越来越多地使用C++,并且此时只有一些关于ofstream的经验.大多数所述经验都是对变量进行简单的文件输出,并使用ifstream将其读回.我没做过的是任何有物体的东西.

让我们假设我有一个经常被写入的对象(比如游戏,对象就是角色)每次击中角色时,每次击败他们获得经验的敌人时,都会重新编写hp. ...我的基本想法是编写一个简单的基于文本的地下城爬行游戏.但是我如何制作某种自动保存文件?我是否只是将对象的每个属性单独写入文件,然后从那里移到更大更好的位置?如果我现在必须这样做,那就是我要去做的事情,但是我不禁感到有一种比这更简单的方式....

有人帮我把整个对象的内容(以及它各自的属性)输出到文件中吗?

c++ serialization object

9
推荐指数
1
解决办法
2万
查看次数

将c ++结构转储到文本文件中

如何将C++中的结构内容写入文本文件?我想要做的是,比如我有一个名为A的结构,数据成员是A.one,A.two等等,我想逐行将它们写成文本文件,就像这样

结构A
A.one =值
A.two =值...

结构B
B.one =值
B.two =值

基本上我想要转储..有一个简单的方法来做到这一点?什么是最好的I/O方法?CFile的?iostream的?谢谢..是否有更简单的方法来转储类的成员数据的所有值?


编辑:废话,谢谢你们..

c++ file-io logging

7
推荐指数
2
解决办法
4546
查看次数

C++ Object to XML用于通信

我正在寻找一种简单的方法将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++ xml serialization xml-serialization

6
推荐指数
1
解决办法
4193
查看次数

C++:类型与标准定义的任何其他数据类型之间是否存在双射映射?

我正在开发一个大量使用静态多态性的项目。我感兴趣的一个特定用例可以通过静态反射来实现,但我们在 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_ttype2_t,是否存在任何 …

c++ static-reflection

6
推荐指数
1
解决办法
152
查看次数

如何在C++中仅将成员变量转换为字节数组?

长话短说

我有一个不仅仅是成员变量(例如它们包含函数)的结构,我只想将成员变量转换为字节数组(/向量),这样我就可以将数据上传到Vulkan中的显卡。如何仅获取结构体中代表成员变量的部分?

我的具体做法

我有一个设置,我使用一个空ParamsBase结构,并从中继承ParamsAParamsB...实际包含成员变量的结构。我使用它,这样我就可以将成员保留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++ struct sizeof

6
推荐指数
1
解决办法
375
查看次数

是否可以在C++中序列化和反序列化对象?

我们知道c ++也是一种面向对象的编程语言,其中大多数东西都是像java这样的对象.所以想知道Serialize和deserializ功能是否可以在c ++中使用,我们在java中也可以使用?

如果是,如何实现?

在java中我们使用Serializable接口来说明这种类型的对象可以被序列化和反序列化.

那么在c ++中如何?

出于好奇,它在c#和java中一样吗?

c# c++ java

4
推荐指数
1
解决办法
1989
查看次数

工厂方法实现 - C++

我有"工厂"设计模式实现的以下代码.

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++ templates design-patterns factory

3
推荐指数
3
解决办法
2万
查看次数

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)

请原谅任何错别字,这只是我头脑中的一个例子.如果我正在序列化的结构有内部指针,显然它会变得更复杂.

所以,我有两个密切相关的问题:

  1. 上面的特定场景中是否存在任何问题,通过将结构直接转换为char缓冲区进行序列化,假设我知道目标系统具有相同的字节顺序?

  2. 主要问题:有没有更好的......呃...... C++?除了添加智能指针之外,还能做到这一点吗?我觉得这是一个常见的问题,STL可能会处理它 - 如果没有,我相信无论如何使用C++机制都有更好的方法.

如果您可以使用标准C++/STL更好地序列化此结构,而不添加库,那么编辑奖励积分.

c++ serialization

3
推荐指数
2
解决办法
2001
查看次数

For循环vs赋值运算符

直接赋值( =)与转换内容相同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与'='相同

c++ bit-manipulation copy

0
推荐指数
1
解决办法
330
查看次数