【问题标题】:Deserialize bytes array in C++ which was serialized in C#反序列化在 C# 中序列化的 C++ 中的字节数组
【发布时间】:2017-11-14 10:37:56
【问题描述】:

我有一个CameraSpacePoint 数组,我已将其转换为 C# 编程语言中的字节。 CameraSpacePoint 定义如下:

namespace Microsoft.Kinect
{
    public struct CameraSpacePoint
    {
        public float X;
        public float Y;
        public float Z;
   }
}

为了将CameraSpacePoint的数组转换为字节,我在C#中使用了以下方法:

public static byte[] ObjectToByteArray(Object obj)
{
    BinaryFormatter bf = new BinaryFormatter();
    using (var ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

然后使用 TCP 传输字节数组。我正在尝试通过以下方式在另一台机器上接收此字节数组:

#include <ros/ros.h>
#include <boost/asio.hpp>
constexpr size_t data_size = 512 * 424;
unsigned char data_buffer[data_size];
boost::asio::read(socket, boost::asio::buffer(data_buffer, data_size));

我在 C++ 中声明了一个类似的类,如下所示:

class CameraSpacePoint
{
public:
    float X;
    float Y;
    float Z;
};

我想知道如何将字节数组转换回我定义的CameraSpacePoint数组对象?

【问题讨论】:

  • 如何被序列化和传输?你提到的bytes数组在哪里?
  • 一般方法是使用谷歌协议缓冲区。另一种可能性是使用 memcpy(&yourCppStruct, buffer, size);但这不安全,不推荐。
  • @Ptaq666 如果您是序列化代码的唯一所有者,这怎么会不安全?
  • @PasserBy,好吧,如果缓冲区中的数据不一致(出于某种原因),可能很难调试。

标签: c++ arrays deserialization tcp-ip


【解决方案1】:

C# 编程语言中对象的内存布局和序列化与 C/C++ 中的类似概念无关。拥有不同的编译器/操作系统,即使在 C++ 到 C++ 的场景中,您也可能会为相同的结构或类获得不同的内存布局(根据内存布局等)。

您真正需要的是两种语言的通用协议来序列化和反序列化相似的对象。有一些支持两种语言的序列化库:

  • Google's Protocol Buffers 同时支持 C# 和 C++,它与平台无关。 (例如,您可以使用它在 big-endian ARM 和 little-endian x86_64 之间进行序列化/反序列化)

  • Microsoft Bond 同时支持 C# 和 C++

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2010-11-25
  • 2019-02-07
相关资源
最近更新 更多