The code below (data encoded in Go) and then decoded in Rust. works fine.
extern crate rmp_serde as rmps;
extern crate serde;
#[macro_use]
extern crate serde_derive;
use rmps::{Deserializer, Serializer};
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct Child {
name: String,
age: f64,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct Person {
name: String,
age: f64,
children: Vec<Child>,
}
fn main() {
let data = std::fs::read("/tmp/msg.pack").unwrap();
let person: Person = rmps::from_slice(&data).unwrap();
println!("{:?}", person);
}
package main
import (
"os"
"github.com/vmihailenco/msgpack"
)
type Child struct {
Name string `msgpack:"name"`
Age float64 `msgpack:"age"`
}
type Person struct {
Name string `msgpack:"name"`
Age float64 `msgpack:"age"`
Children []Child `msgpack:"children"`
}
func main() {
f, err := os.Create("/tmp/msg.pack")
if err != nil {
panic(err)
}
enc := msgpack.NewEncoder(f)
p := Person{
Name: "azmy",
Age: 37,
Children: []Child{
{Name: "yahia", Age: 6},
{Name: "yassine", Age: 5},
},
}
if err := enc.Encode(p); err != nil {
panic(err)
}
}
We just need to make sure that the encoder/decoder uses the same field names (lower case in this test).