gpt4 book ai didi

c++ - 大多数基本类型的高效二进制序列化

转载 作者:行者123 更新时间:2023-12-02 01:47:41 25 4
gpt4 key购买 nike

我正在尝试找出通过网络传输某些数据的最佳方法。这是我希望实现的目标:

应用程序运行并计算一些数据:

int w = 5;
float x = 4.736;
std::string y = "Some String.";
std::vector<int> z;
z.push_back(1);
z.push_back(2);
z.push_back(3);

然后我们将其放入二进制容器中:

BinaryContainer Data;
Data.Write(w);
Data.Write(x);
Data.Write(y);
Data.Write(z);

然后我们通过网络传输它:

SendData(Data.c_str());

并在另一面读出:

BinaryContainer ReceivedData(IncomingData);
int w = ReceivedData.Read();
float x = ReceivedData.Read();
std::string y = ReceivedData.Read();
std::vector<int> z = ReceivedData.Read();

上面的示例从高层角度概述了基本功能应如何工作。我查看了许多不同的序列化库,但似乎没有一个是完全合适的。我倾向于学习如何自己编写功能。

字节序并不重要。读取和写入数据的架构永远不会有不同。我们只需要在容器内存储二进制数据。读取应用程序和写入应用程序专门负责按照写入的顺序读取数据。只需要编写基本类型,不需要编写完整的任意类或指向事物的指针。最重要的是,总体而言,发生这种情况的速度应该是最高优先级的,因为一旦数据被制定,我们需要将其写入容器,通过网络传输,并尽快在另一端读取它。

网络传输目前正在使用低级 WinSock RIO API 完成,我们已经尽快将数据从应用程序移动到线路。线路上的传输延迟始终会更高且速率可变。我们在传输之前序列化数据的点是链中的下一步,以确保我们在将数据传输到网络之前浪费尽可能少的时间。

新数据包将很快被接收,因此预分配资源的能力将是有益的。例如:

Serializer DataHandler;
...
void NewIncomingPacket(const char* Data)
{
DataHandler.Reset();
DataHandler.Load(Data);
int x = DataHandler.Read();
float y = DataHandler.Read();
...
}

我正在寻求社区专家的意见,以了解此处的发展方向。

最佳答案

我写了seriously ,一个仅包含头文件的快速 C++ 库,应该可以满足您的需求:-)

它提供了序列化器和反序列化器。

序列化数据可以跨不同架构和字节序移植。没有外部依赖。

    seriously::Packer<1024> packer;     // a 1024 byte serialization buffer

int32_t value1 = 83656;
bool value2 = true;
int16_t value3 = -2345;
std::string value4("only an example");
double value5 = -6.736;
std::vector<int64_t> value6;

value6.push_back(42);
value6.push_back(11);
value6.push_back(93);

packer << value1 << value2 << value3 << value4 << value5 << value6;

std::cout << "packed size: " << packer.size() << std::endl;
// packer.data() contains the serialized data

int32_t restored1;
bool restored2;
int16_t restored3;
std::string restored4;
double restored5 = -6.736;
std::vector<int64_t> restored6;

packer >> restored1 >> restored2 >> restored3 >> restored4 >> restored5 >> restored6;

std::cout << "unpacked: " << restored1 << " " << (restored2 ? "t" : "f") << " " << restored3 << " " << restored4 << " " << restored5 << std::endl;

std::vector<int64_t>::const_iterator it;
for (it = restored6.begin(); it != restored6.end(); it++) {
std::cout << *it << std::endl;
}

关于c++ - 大多数基本类型的高效二进制序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59174063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com