JSON反序列化C++
JSON deserialization C++
我想使用C++将JSON文件反序列化为对象(类)。我研究过rapidjson库,并使每个类都有一个以根为参数的反序列化方法,这样它就可以反序列化自己。它看起来像这样:
void PoliceOfficer::Deserialize(rapidjson::Value& root)
{
if (root.IsObject())
{
if (root.HasMember("name"))
{
if (root["name"].IsString())
{
name = root["name"].GetString();
}
}
if (root.HasMember("maxHealth"))
{
if (root["maxHealth"].IsNumber())
{
maxHealth = (float)root["maxHealth"].GetDouble();
}
}
if (root.HasMember("skills"))
{
rapidjson::Value& skills = root["skills"];
if (skills.IsArray())
{
for (rapidjson::SizeType i = 0; i < skills.Size(); i++)
{
Skill tempSkill;
tempSkill.Deserialize(skills[i]);
m_skills.push_back(tempSkill);
}
}
}
}
}
但这似乎是一项艰巨的工作。您必须在所有要反序列化的类中实现此方法。所以我想知道是否有任何方法可以自动做到这一点,比如下面的代码行(JSON.NET):
Movie m = JsonConvert.DeserializeObject<Movie>(json);
所以我不必为所有类编写反序列化方法。我做这件事的方式是唯一的方法吗?我正在使用rapidjson,但我愿意尝试另一个库。
我希望这个问题有意义:)
提前谢谢!
要处理像这样的问题,您需要一个可能的解决方案,将所有信息集中在一个函数中,在该函数中,您可以生成映射结构字段<--->json/xml/ini文件中的条目。类似这样的东西:
struct abc_t
{
int a ;
string b ;
} ;
void serialize(serializer_t &serializer, abc_t &abc)
{
serializer.exx(abc.a, "abc") ;
serializer.exx(abc.b, "b") ;
}
问题是如何编写这个序列化程序。解决方案可以是这样一个抽象类:
class serializer_t
{
public:
virtual ~serializer_t(void) {}
virtual void exx(int &value, const char *tag) = 0 ;
virtual void exx(string &value, const char *tag) = 0 ;
} ;
然后将有两个派生类,一个实现写入的serializerwritert和一个实现读取的serializer_readert。
另一种可能性是静态多态性:这意味着将原始void serialize(serializer_t &serializer, abc_t &abc)
作为模板函数。如果您有一个复合对象,那么您需要将此策略应用于每个子对象。
看看boost.serialization:你会发现关于这个任务中涉及的所有权衡的深入讨论
相关文章:
- 如何知道QDataStream不能反序列化某些内容
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何反序列化数组?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 通过 tcp 发送 C# 类并在 C++ 上反序列化
- 序列化和反序列化boost共享指针
- 在C++中使用POCO和grain对多个对象进行反序列化
- C++中整数向量的序列化/反序列化
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 使用 QDataStream 对原始数据进行反序列化
- 使用协议缓冲区创建通用反序列化程序
- 如何在C++中从头开始反序列化文件(没有库)
- 在协议缓冲区 c++ 中反序列化字符串数组
- 在进程的内存中序列化/反序列化
- 谷物/C++ 11 - 如何指定反序列化的可选参数
- 是否可以反序列化(从原始内存块)没有默认构造函数的对象?
- 如何从平面缓冲区中反序列化联合结构的 void* 值的大小
- 用 Boost 反序列化犰狳 colvec