实现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>
MapKernal::MapKernal(std::shared_ptr<MessageLoader> ins)
: _bind_loader(ins) {
:_bind_loader(ins) {
}
QList<QString> MapKernal::compareTypes() const
@ -65,7 +65,7 @@ void MapKernal::registCompare(std::shared_ptr<CompareDelegate> ins)
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))
return nullptr;
@ -83,7 +83,7 @@ QList<QString> MapKernal::convertTypes() const
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))
return nullptr;
@ -95,17 +95,12 @@ void MapKernal::registExecute(std::shared_ptr<ExecuteDelegate> ins)
_execute_types[ins->typeName()] = ins;
}
std::shared_ptr<MessageLoader> MapKernal::messageLoader() const
{
return this->_bind_loader;
}
void MapKernal::initial()
{
// 注册基础数据类型
registData(std::make_shared<GeneralData>());
for (auto key : messageLoader()->allType())
registData(messageLoader()->makeDefault(key));
for (auto key : _bind_loader->allType())
registData(_bind_loader->makeDefault(key));
// 注册可用节点类型
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()));
}
QJSEngine& MapKernal::bindEngine()
{
return this->_core_engine;
}
void MapKernal::registData(std::shared_ptr<TopicData> init)
{
if (_variable_types.contains(init->topicString()))
@ -130,7 +130,7 @@ QList<QString> MapKernal::dataTypes() const
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];
}
@ -140,7 +140,7 @@ QList<QString> MapKernal::executeTypes() const
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];
}
@ -155,7 +155,7 @@ QList<QString> MapKernal::nodeTypes() const
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];
}
@ -165,6 +165,104 @@ std::shared_ptr<Serializable> MapKernal::newDefault() const
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)
:_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> keys;
for(auto key : this->_variables.keys())
if(this->_variables[key].first == IO_TYPE::INPUT)
for (auto key : this->_variables.keys())
if (this->_variables[key].first == IO_TYPE::INPUT)
keys << key;
return keys;
@ -736,6 +834,20 @@ bool CompareDelegate::compare(std::shared_ptr<TopicData> vleft, std::shared_ptr<
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)
: _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;
}
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)
: LogicalNode(NodeKind::ACTIONNODE, ins) {
}
@ -955,10 +1082,10 @@ std::shared_ptr<Serializable> ModifiedNode::newDefault() const
void ModifiedNode::recoveryFrom(const QJsonObject& obj)
{
}
void ModifiedNode::saveTo(QJsonObject& obj) const
{
}

View File

@ -18,8 +18,8 @@ struct COMPONENTBASIC_EXPORT GeneralData : public TopicData {
QJsonObject _element_bind;
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 saveTo(QJsonObject& obj) const override;
};
@ -37,6 +37,7 @@ private:
/// 绑定载入器
/// </summary>
std::shared_ptr<MessageLoader> _bind_loader;
QJSEngine _core_engine;
/// <summary>
/// {Topicdefault-value}
@ -76,13 +77,8 @@ public:
MapKernal(std::shared_ptr<MessageLoader> ins);
virtual ~MapKernal() = default;
/// <summary>
/// »ñÈ¡MessageLoaderµ¥Àý
/// </summary>
/// <returns></returns>
std::shared_ptr<MessageLoader> messageLoader() const;
void initial();
QJSEngine& bindEngine();
// 数据类型管理 ======================================================
/// <summary>
@ -100,7 +96,7 @@ public:
/// </summary>
/// <param name="topic"></param>
/// <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>
/// <param name="name"></param>
/// <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>
/// <param name="name"></param>
/// <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>
/// <param name="name"></param>
/// <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>
/// <param name="name"></param>
/// <returns></returns>
virtual std::shared_ptr<ExecuteDelegate> getExecute(const QString& name);
virtual std::shared_ptr<ExecuteDelegate> getExecute(const QString& name) const;
// 通过 Serializable 继承
std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override {}
void saveTo(QJsonObject& obj) const override {}
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
/// <summary>
/// 比较关系实例
/// </summary>
class COMPONENTBASIC_EXPORT CompareDelegate {
class COMPONENTBASIC_EXPORT CompareDelegate : public Serializable {
private:
QJSEngine& _script_engine;
QString _function_name;
@ -206,12 +202,17 @@ public:
QString name() const;
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>
class COMPONENTBASIC_EXPORT ConvertDelegate {
class COMPONENTBASIC_EXPORT ConvertDelegate : public Serializable {
public:
typedef QString DATA_TOPIC_STRING;
@ -256,6 +257,9 @@ public:
/// <returns></returns>
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:
std::shared_ptr<MapKernal> _host_bind;