- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 XML 序列化反射类型,我可以像这样得到它的序列化:
template <typename Archive>
std::function<void(Archive&,unsigned)> get_serialization_for_type(std::string name);
class_id
XML 中的属性与有效名称匹配。如何反序列化这些类型?有没有办法可以获取存档正在读取的当前节点的属性?也欢迎就不同方法提出建议,但我无法更改 XML 的格式。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="17">
...
<container class_id="23" tracking_level="0" version="0">
<count>2</count>
<typeA class_id="type_a" tracking_level="0" version="0">
...
</typeA>
<typeB class_id="type_b" tracking_level="0" version="0">
...
</typeB>
</container>
...
</boost_serialization>
最佳答案
That looks like a regular Boost Serialization XML archive. Why don't you read it in exactly the same way as you wrote it?
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/unique_ptr.hpp>
#include <boost/serialization/assume_abstract.hpp>
#include <boost/serialization/export.hpp>
#include <iostream>
#include <sstream>
#include <boost/core/demangle.hpp>
namespace MyLib {
struct Base {
using BaseContainer = std::vector<std::unique_ptr<Base> >;
virtual ~Base() = default;
int a, b, c;
};
struct A : Base {
std::string d, e, f;
};
struct B : Base {
float h, i, j;
};
template <typename Ar> void serialize(Ar& ar, Base& base, unsigned) {
ar & BOOST_SERIALIZATION_NVP(base.a)
& BOOST_SERIALIZATION_NVP(base.b)
& BOOST_SERIALIZATION_NVP(base.c)
;
}
template <typename Ar> void serialize(Ar& ar, A& a, unsigned) {
ar & boost::serialization::make_nvp("Base", boost::serialization::base_object<Base>(a))
& BOOST_SERIALIZATION_NVP(a.d)
& BOOST_SERIALIZATION_NVP(a.e)
& BOOST_SERIALIZATION_NVP(a.f)
;
}
template <typename Ar> void serialize(Ar& ar, B& b, unsigned) {
ar & boost::serialization::make_nvp("Base", boost::serialization::base_object<Base>(b))
& BOOST_SERIALIZATION_NVP(b.h)
& BOOST_SERIALIZATION_NVP(b.i)
& BOOST_SERIALIZATION_NVP(b.j)
;
}
using BaseContainer = std::vector<std::unique_ptr<Base> >;
}
//BOOST_SERIALIZATION_ASSUME_ABSTRACT(MyLib::Base)
BOOST_CLASS_EXPORT(MyLib::Base)
BOOST_CLASS_EXPORT_GUID(MyLib::A, "type_A")
BOOST_CLASS_EXPORT_GUID(MyLib::B, "type_B")
int main() {
std::stringstream xml;
{
MyLib::BaseContainer container;
container.emplace_back(std::make_unique<MyLib::A>());
container.emplace_back(std::make_unique<MyLib::B>());
container.emplace_back(std::make_unique<MyLib::B>());
container.emplace_back(std::make_unique<MyLib::A>());
boost::archive::xml_oarchive oa(xml);
oa << BOOST_SERIALIZATION_NVP(container);
}
//std::cout << xml.str();
{
boost::archive::xml_iarchive ia(xml);
MyLib::BaseContainer container;
ia >> BOOST_SERIALIZATION_NVP(container);
for (auto& el : container) {
std::cout << "Element of type " << boost::core::demangle(typeid(*el).name()) << "\n";
}
}
}
Element of type MyLib::A
Element of type MyLib::B
Element of type MyLib::B
Element of type MyLib::A
关于c++ - Boost XML 基于 class_id 的反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60238862/
我在训练时使用 Yolo 来训练自定义对象检测,但出现以下错误 Wrong annotation: class_id = 1. But class_id should be [from 0 to
我有一个 XML 序列化反射类型,我可以像这样得到它的序列化: template std::function get_serialization_for_type(std::string name)
XML 序列化是否有可能使用更人性化的 class_id 作为 GUID,使用 BOOST_CLASS_EXPORT_GUID 描述??? 考虑序列化类: SomeClass* b=new SomeC
我正在学习 Python 并解决机器学习问题。 class_ids=np.arange(self.x.shape[0]) np.random.shuffle(class_ids) self.x=sel
我是 Rails 的新手,正在 rails3 (beta4) 上构建一个小型测试应用程序。 我正在使用 Authlogic 来管理用户 session (以标准方式设置为 per this tutor
我是一名优秀的程序员,十分优秀!