I've successfully transfered data from a C# and a C++ program using the same class via ZMQ, where the C++ class is the data definition and the compiler luckily masks the byte-array to the class.
How would I do the same thing between say a C# and a Node.js program? I would think they would need some type of Intermediate Data Definition.
The answer is that you need an IDL that is then compiled to your given languages, unless your languages pack similarly by default, like in C to C++.
If you need a msgpack IDL, see if one is available here or here