在C ++中反序列化字节数组,该数组在C#中被序列化

时间:2017-11-14 10:37:56

标签: c++ arrays deserialization tcp-ip

我有一个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数组对象?

1 个答案:

答案 0 :(得分:2)

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

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

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

  • Microsoft Bond支持C#和C ++