はい、これを行うことができます。 foo_v1
をパックして解凍した後、foo_v2
、a
、およびb
に変換すると、パックされた値が入ります。
#include <msgpack.hpp>
#include <cassert>
#include <iostream>
#include <sstream>
struct foo_v1 {
int a;
float b;
MSGPACK_DEFINE(a, b); // pack as ARRAY, order is important
};
struct foo_v2 {
int a;
float b;
std::string c;
MSGPACK_DEFINE(a, b, c); // pack as ARRAY, order is important
};
int main() {
foo_v1 v1 { 123, 45.67 };
std::stringstream ss;
msgpack::pack(ss, v1);
auto oh = msgpack::unpack(ss.str().data(), ss.str().size());
auto v2 = oh.get().as<foo_v2>();
std::cout << "a: " << v2.a << std::endl;
std::cout << "b: " << v2.b << std::endl;
std::cout << "c: " << v2.c << std::endl;
}
実行デモ:https://wandbox.org/permlink/91wRtVdJJCC5IEDxあなたがfoo_v2
をパックしてから、その後foo_v1
、a
とb
がパック値で満たされているとして、それを変換し、それを解凍した場合
同様に、c
をスライスする(無視)。
#include <msgpack.hpp>
#include <cassert>
#include <iostream>
#include <sstream>
struct foo_v1 {
int a;
float b;
MSGPACK_DEFINE(a, b); // pack as ARRAY, order is important
};
struct foo_v2 {
int a;
float b;
std::string c;
MSGPACK_DEFINE(a, b, c); // pack as ARRAY, order is important
};
int main() {
foo_v2 v2 { 123, 45.67, "hello" };
std::stringstream ss;
msgpack::pack(ss, v2);
auto oh = msgpack::unpack(ss.str().data(), ss.str().size());
auto v1 = oh.get().as<foo_v1>();
std::cout << "a: " << v1.a << std::endl;
std::cout << "b: " << v1.b << std::endl;
}
実行デモ:https://wandbox.org/permlink/mxmSkVHebZFiOM1q
これらの例は、MSGPACK_DEFINE
マクロを使用しています。 https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_adaptor#defining-custom-adaptorsを参照してください。 デフォルトではARRAYとしてパッキング/変換します。だから順序が重要です。 MSGPACK_DEFINE_MAP
を使用する場合、ユーザークラスはMAPとしてパッキング/変換されます。 MAP
のキーは、デフォルトでは変数名です。を使用して変更することができます(https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_adaptor#since-210を参照)。 MAP
の値は、メンバ変数の値です。 MAP
は、ARRAY
よりも柔軟ですが、非効率です。
あなたがMSGPACK_DEFINE_MAP
を使用する場合は、順序を気にする必要はありません。
デモ実行
#include <msgpack.hpp>
#include <cassert>
#include <iostream>
#include <sstream>
struct foo_v1 {
int a;
float b;
MSGPACK_DEFINE_MAP(a, b); // pack as MAP
};
struct foo_v2 {
int a;
std::string c;
float b;
MSGPACK_DEFINE_MAP(a, c, b); // pack as MAP, c is at the middle position
};
int main() {
foo_v2 v2 { 123, "hello", 45.67, };
std::stringstream ss;
msgpack::pack(ss, v2);
auto oh = msgpack::unpack(ss.str().data(), ss.str().size());
auto v1 = oh.get().as<foo_v1>();
std::cout << "a: " << v1.a << std::endl;
std::cout << "b: " << v1.b << std::endl;
}
:ここhttps://wandbox.org/permlink/ozihpwXMJRpOhzT4
がよりcomplecated例です:デモを実行 https://github.com/msgpack/msgpack-c/blob/master/example/cpp03/map_based_versionup.cpp
:https://stackoverflow.com/questions/:https://wandbox.org/permlink/IUp94Tc4MiT4kU07
多分これはあなたの質問に答えます15579730/android-c-data-serialization Googleプロトコルバッファのような他の選択肢について考えることができます。 – user0042