实现MapKernel的序列化和反序列化

This commit is contained in:
codeboss 2025-07-05 01:42:50 +08:00
parent 4035690976
commit 17d44f1002
2 changed files with 164 additions and 33 deletions

View File

@ -51,7 +51,7 @@ QString BehaviorPerformPlugin::name() const
#include <MessageLoader.h> #include <MessageLoader.h>
MapKernal::MapKernal(std::shared_ptr<MessageLoader> ins) MapKernal::MapKernal(std::shared_ptr<MessageLoader> ins)
: _bind_loader(ins) { :_bind_loader(ins) {
} }
QList<QString> MapKernal::compareTypes() const QList<QString> MapKernal::compareTypes() const
@ -65,7 +65,7 @@ void MapKernal::registCompare(std::shared_ptr<CompareDelegate> ins)
emit this->compareTypeListChanged(); emit this->compareTypeListChanged();
} }
std::shared_ptr<CompareDelegate> MapKernal::getCompare(const QString& name) std::shared_ptr<CompareDelegate> MapKernal::getCompare(const QString& name) const
{ {
if (!_compare_types.contains(name)) if (!_compare_types.contains(name))
return nullptr; return nullptr;
@ -83,7 +83,7 @@ QList<QString> MapKernal::convertTypes() const
return _convert_types.keys(); return _convert_types.keys();
} }
std::shared_ptr<ConvertDelegate> MapKernal::getConvert(const QString& name) std::shared_ptr<ConvertDelegate> MapKernal::getConvert(const QString& name) const
{ {
if (!_convert_types.contains(name)) if (!_convert_types.contains(name))
return nullptr; return nullptr;
@ -95,17 +95,12 @@ void MapKernal::registExecute(std::shared_ptr<ExecuteDelegate> ins)
_execute_types[ins->typeName()] = ins; _execute_types[ins->typeName()] = ins;
} }
std::shared_ptr<MessageLoader> MapKernal::messageLoader() const
{
return this->_bind_loader;
}
void MapKernal::initial() void MapKernal::initial()
{ {
// 注册基础数据类型 // 注册基础数据类型
registData(std::make_shared<GeneralData>()); registData(std::make_shared<GeneralData>());
for (auto key : messageLoader()->allType()) for (auto key : _bind_loader->allType())
registData(messageLoader()->makeDefault(key)); registData(_bind_loader->makeDefault(key));
// 注册可用节点类型 // 注册可用节点类型
registNode(std::make_shared<SequenceNode>(this->shared_from_this())); registNode(std::make_shared<SequenceNode>(this->shared_from_this()));
@ -117,6 +112,11 @@ void MapKernal::initial()
registNode(std::make_shared<BehaviorMapNode>(this->shared_from_this())); registNode(std::make_shared<BehaviorMapNode>(this->shared_from_this()));
} }
QJSEngine& MapKernal::bindEngine()
{
return this->_core_engine;
}
void MapKernal::registData(std::shared_ptr<TopicData> init) void MapKernal::registData(std::shared_ptr<TopicData> init)
{ {
if (_variable_types.contains(init->topicString())) if (_variable_types.contains(init->topicString()))
@ -130,7 +130,7 @@ QList<QString> MapKernal::dataTypes() const
return _variable_types.keys(); return _variable_types.keys();
} }
std::shared_ptr<TopicData> MapKernal::getData(const QString& topic) std::shared_ptr<TopicData> MapKernal::getData(const QString& topic) const
{ {
return _variable_types[topic]; return _variable_types[topic];
} }
@ -140,7 +140,7 @@ QList<QString> MapKernal::executeTypes() const
return _execute_types.keys(); return _execute_types.keys();
} }
std::shared_ptr<ExecuteDelegate> MapKernal::getExecute(const QString& name) std::shared_ptr<ExecuteDelegate> MapKernal::getExecute(const QString& name) const
{ {
return _execute_types[name]; return _execute_types[name];
} }
@ -155,7 +155,7 @@ QList<QString> MapKernal::nodeTypes() const
return _logicalnode_types.keys(); return _logicalnode_types.keys();
} }
std::shared_ptr<LogicalNode> MapKernal::getNode(const QString& name) std::shared_ptr<LogicalNode> MapKernal::getNode(const QString& name) const
{ {
return _logicalnode_types[name]; return _logicalnode_types[name];
} }
@ -165,6 +165,104 @@ std::shared_ptr<Serializable> MapKernal::newDefault() const
return nullptr; return nullptr;
} }
#include <QJsonArray>
#include <QJsonObject>
void MapKernal::recoveryFrom(const QJsonObject& obj)
{
QStringList compares, converts, executes, variable_keys;
STRLIST_PEAK(executes);
STRLIST_PEAK(variable_keys);
STRLIST_PEAK(compares);
STRLIST_PEAK(converts);
// 执行器类型校验
for (auto key : executes) {
if (this->executeTypes().contains(key))
continue;
throw new UniException("当前环境不包含指定执行器类型:" + key);
}
// 变量类型校验
for (auto key : variable_keys) {
if (this->dataTypes().contains(key))
continue;
throw new UniException("当前环境不包含指定变量类型:" + key);
}
this->_compare_types.clear();
// 提取比较器代码
auto compare_array = obj["compare_objs"].toArray();
for (auto idx = 0; idx < compare_array.size(); ++idx) {
auto compare_obj = compare_array.at(idx);
auto func_name = compare_obj["name"].toString();
auto func_obj = compare_obj["define_obj"].toObject();
auto compare_ins = std::make_shared<CompareDelegate>(_core_engine, func_name);
compare_ins->recoveryFrom(func_obj);
this->registCompare(compare_ins);
}
this->_convert_types.clear();
// 提取转换器代码
auto convert_array = obj["convert_objs"].toArray();
for (auto idx = 0; idx < convert_array.size(); ++idx) {
auto convert_obj = convert_array.at(idx);
auto func_name = convert_obj["name"].toString();
auto func_obj = convert_obj["define_obj"].toObject();
auto convert_ins = std::make_shared<ConvertDelegate>(this->shared_from_this(), _core_engine, func_name);
convert_ins->recoveryFrom(func_obj);
this->registConvert(convert_ins);
}
}
void MapKernal::saveTo(QJsonObject& obj) const
{
// 保存比较器代码
QStringList compares = this->compareTypes();
STRLIST_SAVE(compares);
QJsonArray compare_array;
for (auto ins_key : compares) {
auto ins_compare = this->getCompare(ins_key);
QJsonObject compare_obj, ins_entity;
compare_obj["name"] = ins_key;
ins_compare->saveTo(ins_entity);
compare_obj["define_obj"] = ins_entity;
compare_array.append(compare_obj);
}
obj["compare_objs"] = compare_array;
// 保存转换器代码
QStringList converts = this->convertTypes();
STRLIST_SAVE(converts);
QJsonArray convert_array;
for (auto ins_key : converts) {
auto ins_convert = this->getConvert(ins_key);
QJsonObject convert_obj, ins_entity;
convert_obj["name"] = ins_key;
ins_convert->saveTo(ins_entity);
convert_obj["define_obj"] = ins_entity;
convert_array.append(convert_obj);
}
obj["convert_objs"] = convert_array;
// 保存执行器清单
QStringList executes = this->executeTypes();
STRLIST_SAVE(executes);
// 保存变量类型清单
QStringList variable_keys = this->dataTypes();
STRLIST_SAVE(variable_keys);
}
LogicalNode::LogicalNode(NodeKind t, std::shared_ptr<MapKernal> kernal) LogicalNode::LogicalNode(NodeKind t, std::shared_ptr<MapKernal> kernal)
:_node_type(t), _bind_kernal(kernal) { :_node_type(t), _bind_kernal(kernal) {
} }
@ -239,8 +337,8 @@ void BehaviorMapNode::setVariable(const QString& key, IO_TYPE t, std::shared_ptr
QList<QString> BehaviorMapNode::inputVariableKeys() const QList<QString> BehaviorMapNode::inputVariableKeys() const
{ {
QList<QString> keys; QList<QString> keys;
for(auto key : this->_variables.keys()) for (auto key : this->_variables.keys())
if(this->_variables[key].first == IO_TYPE::INPUT) if (this->_variables[key].first == IO_TYPE::INPUT)
keys << key; keys << key;
return keys; return keys;
@ -736,6 +834,20 @@ bool CompareDelegate::compare(std::shared_ptr<TopicData> vleft, std::shared_ptr<
return true; return true;
} }
#include <exception>
std::shared_ptr<Serializable> CompareDelegate::newDefault() const
{
return nullptr;
}
void CompareDelegate::recoveryFrom(const QJsonObject& obj)
{
}
void CompareDelegate::saveTo(QJsonObject& obj) const
{
}
ConvertDelegate::ConvertDelegate(std::shared_ptr<MapKernal> host, QJSEngine& bind_engine, const QString& func) ConvertDelegate::ConvertDelegate(std::shared_ptr<MapKernal> host, QJSEngine& bind_engine, const QString& func)
: _host_bind(host), _script_engine(bind_engine), _function_name(func) { : _host_bind(host), _script_engine(bind_engine), _function_name(func) {
} }
@ -770,6 +882,21 @@ std::shared_ptr<TopicData> ConvertDelegate::convert(const QList<std::shared_ptr<
return nullptr; return nullptr;
} }
std::shared_ptr<Serializable> ConvertDelegate::newDefault() const
{
return nullptr;
}
void ConvertDelegate::recoveryFrom(const QJsonObject& obj)
{
}
void ConvertDelegate::saveTo(QJsonObject& obj) const
{
}
ExecuteNode::ExecuteNode(std::shared_ptr<MapKernal> ins) ExecuteNode::ExecuteNode(std::shared_ptr<MapKernal> ins)
: LogicalNode(NodeKind::ACTIONNODE, ins) { : LogicalNode(NodeKind::ACTIONNODE, ins) {
} }
@ -955,10 +1082,10 @@ std::shared_ptr<Serializable> ModifiedNode::newDefault() const
void ModifiedNode::recoveryFrom(const QJsonObject& obj) void ModifiedNode::recoveryFrom(const QJsonObject& obj)
{ {
} }
void ModifiedNode::saveTo(QJsonObject& obj) const void ModifiedNode::saveTo(QJsonObject& obj) const
{ {
} }

View File

@ -18,8 +18,8 @@ struct COMPONENTBASIC_EXPORT GeneralData : public TopicData {
QJsonObject _element_bind; QJsonObject _element_bind;
QString topicString() const override; QString topicString() const override;
std::shared_ptr<Serializable> newDefault() const override;
std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override; void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override; void saveTo(QJsonObject& obj) const override;
}; };
@ -37,6 +37,7 @@ private:
/// 绑定载入器 /// 绑定载入器
/// </summary> /// </summary>
std::shared_ptr<MessageLoader> _bind_loader; std::shared_ptr<MessageLoader> _bind_loader;
QJSEngine _core_engine;
/// <summary> /// <summary>
/// {Topicdefault-value} /// {Topicdefault-value}
@ -76,13 +77,8 @@ public:
MapKernal(std::shared_ptr<MessageLoader> ins); MapKernal(std::shared_ptr<MessageLoader> ins);
virtual ~MapKernal() = default; virtual ~MapKernal() = default;
/// <summary>
/// »ñÈ¡MessageLoaderµ¥Àý
/// </summary>
/// <returns></returns>
std::shared_ptr<MessageLoader> messageLoader() const;
void initial(); void initial();
QJSEngine& bindEngine();
// 数据类型管理 ====================================================== // 数据类型管理 ======================================================
/// <summary> /// <summary>
@ -100,7 +96,7 @@ public:
/// </summary> /// </summary>
/// <param name="topic"></param> /// <param name="topic"></param>
/// <returns></returns> /// <returns></returns>
virtual std::shared_ptr<TopicData> getData(const QString& topic); virtual std::shared_ptr<TopicData> getData(const QString& topic) const;
@ -121,7 +117,7 @@ public:
/// </summary> /// </summary>
/// <param name="name"></param> /// <param name="name"></param>
/// <returns></returns> /// <returns></returns>
virtual std::shared_ptr<LogicalNode> getNode(const QString& name); virtual std::shared_ptr<LogicalNode> getNode(const QString& name) const;
@ -142,7 +138,7 @@ public:
/// </summary> /// </summary>
/// <param name="name"></param> /// <param name="name"></param>
/// <returns></returns> /// <returns></returns>
virtual std::shared_ptr<CompareDelegate> getCompare(const QString& name); virtual std::shared_ptr<CompareDelegate> getCompare(const QString& name) const;
@ -163,7 +159,7 @@ public:
/// </summary> /// </summary>
/// <param name="name"></param> /// <param name="name"></param>
/// <returns></returns> /// <returns></returns>
virtual std::shared_ptr<ConvertDelegate> getConvert(const QString& name); virtual std::shared_ptr<ConvertDelegate> getConvert(const QString& name) const;
@ -183,20 +179,20 @@ public:
/// </summary> /// </summary>
/// <param name="name"></param> /// <param name="name"></param>
/// <returns></returns> /// <returns></returns>
virtual std::shared_ptr<ExecuteDelegate> getExecute(const QString& name); virtual std::shared_ptr<ExecuteDelegate> getExecute(const QString& name) const;
// 通过 Serializable 继承 // 通过 Serializable 继承
std::shared_ptr<Serializable> newDefault() const override; std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override {} void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override {} void saveTo(QJsonObject& obj) const override;
}; };
/// <summary> /// <summary>
/// 比较关系实例 /// 比较关系实例
/// </summary> /// </summary>
class COMPONENTBASIC_EXPORT CompareDelegate { class COMPONENTBASIC_EXPORT CompareDelegate : public Serializable {
private: private:
QJSEngine& _script_engine; QJSEngine& _script_engine;
QString _function_name; QString _function_name;
@ -206,12 +202,17 @@ public:
QString name() const; QString name() const;
bool compare(std::shared_ptr<TopicData> vleft, std::shared_ptr<TopicData> vright); bool compare(std::shared_ptr<TopicData> vleft, std::shared_ptr<TopicData> vright);
std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
}; };
/// <summary> /// <summary>
/// 数据转换实例 /// 数据转换实例
/// </summary> /// </summary>
class COMPONENTBASIC_EXPORT ConvertDelegate { class COMPONENTBASIC_EXPORT ConvertDelegate : public Serializable {
public: public:
typedef QString DATA_TOPIC_STRING; typedef QString DATA_TOPIC_STRING;
@ -256,6 +257,9 @@ public:
/// <returns></returns> /// <returns></returns>
std::shared_ptr<TopicData> convert(const QList<std::shared_ptr<TopicData>>& input_variables); std::shared_ptr<TopicData> convert(const QList<std::shared_ptr<TopicData>>& input_variables);
std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
private: private:
std::shared_ptr<MapKernal> _host_bind; std::shared_ptr<MapKernal> _host_bind;