{"id":2598,"date":"2016-12-12T13:55:47","date_gmt":"2016-12-12T12:55:47","guid":{"rendered":"https:\/\/www.vikingsoftware.com\/uncategorized-da\/serializing-deserializing-a-qobject-tree\/"},"modified":"2016-12-12T13:55:47","modified_gmt":"2016-12-12T12:55:47","slug":"serializing-deserializing-a-qobject-tree","status":"publish","type":"post","link":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/","title":{"rendered":"Serializing\/deserializing a QObject tree"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"2598\" class=\"elementor elementor-2598 elementor-640\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-section elementor-top-section elementor-element elementor-element-50cb995 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"50cb995\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-902978e\" data-id=\"902978e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c3830ab elementor-widget elementor-widget-text-editor\" data-id=\"c3830ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre><strong>Written by G\u00fcnter Schwann<\/strong><br \/><strong>2016\/12\/12<\/strong><\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-be676ef elementor-widget elementor-widget-text-editor\" data-id=\"be676ef\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A while ago I wanted to implement save and load for an application.&nbsp;<\/p>\n<p>The application model was a QObject derived class, with a bunch of sub (-sub) classes. As the UI was QML, everything was accessible through properties.<\/p>\n<p>Instead of writing a save and load mechanism for every single class, I was able to write one generic save load mechanism.<\/p>\n<p>This can be done using&nbsp;QObject introspection\/reflection. So the class name, properties and member functions can be queried.<\/p>\n<p>For example if you have this class derived from QObject:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ebdba9e elementor-widget elementor-widget-code-highlight\" data-id=\"ebdba9e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>class SomeQObject : public QObject\n{\n\u00a0\u00a0\u00a0 Q_OBJECT\n\u00a0\u00a0\u00a0 Q_PROPERTY(int id READ id WRITE setId NOTIFY idChanged)\npublic:\n\u00a0\u00a0\u00a0 int id() const;\n \u00a0\u00a0\u00a0void setId();\nsignals:\n \u00a0\u00a0\u00a0void idChanged();\n};<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-386d9f3 elementor-widget elementor-widget-text-editor\" data-id=\"386d9f3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>To get the class name you do the following:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dd3dc74 elementor-widget elementor-widget-code-highlight\" data-id=\"dd3dc74\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>SomeQObject obj;\nconst QMetaObject* metaObj = obj->metaObject();\nQString className = metaObj->className();<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-409314c elementor-widget elementor-widget-text-editor\" data-id=\"409314c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Then className is \u201cSomeQObject\u201d.<\/p><p>And to query for the properties you do the following:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-215a582 elementor-widget elementor-widget-code-highlight\" data-id=\"215a582\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>for (int i = 0; i < metaObj->propertyCount(); ++i) {\n    const char* propertyName = metaObj->property(i).name();\n    QVariant value = obj.property(propertyName);\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-95db240 elementor-widget elementor-widget-text-editor\" data-id=\"95db240\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>For querying QObject dynamic properties, the code looks a bit different:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f1ed87e elementor-widget elementor-widget-code-highlight\" data-id=\"f1ed87e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>for (const QByteArray& propertyName : obj->dynamicPropertyNames()) {\n    QVariant value = obj->property(propertyName.data()));\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a3a4051 elementor-widget elementor-widget-text-editor\" data-id=\"a3a4051\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Using\u00a0<a href=\"http:\/\/doc.qt.io\/qt-5\/qobject.html#setProperty\">QObject\u2019s setProperty()<\/a>\u00a0function one can set the property as well.<\/p><p>Methods can be queried using<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3b89fe3 elementor-widget elementor-widget-code-highlight\" data-id=\"3b89fe3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>for (int i = 0; i < metaObj->methodCount(); ++i) {\n    QMetaMethod method = metaObj->method(i);\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ed48cc8 elementor-widget elementor-widget-text-editor\" data-id=\"ed48cc8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>I used this, to serialize and deserialize a QObject to a JSON text file. It\u2019s pretty simple using\u00a0<a href=\"http:\/\/doc.qt.io\/qt-5\/json.html\">Qt\u2019s JSON<\/a>\u00a0support.<\/p><p><a href=\"https:\/\/gitlab.com\/vikingsoft\/blog-qobject-serialize\">The code can be found here.<\/a><\/p><p>This code works quite well for my needs, but is in no way finished. For example several types like QRect are not supported.<\/p><p>The nice thing is, that this library does not need to know anything about the objects that it\u2019s handling. As long they are derived from QObject. And for the deserialization, only a tiny factory method is needed to create the object. Im my case I used simple lambda functions.<\/p><p>So absolutely no change is needed in the QObject derived classes themselves. And if a class changes, as for example a property is added, nothing needs to be done to handle that property as well. It\u2019s done automatically.<\/p><p>One can continue to extend the app model. The save\/load just keeps working.<\/p><p>But you are not limited to\u00a0loading\/saving with JSON. Using this JSON transformation, you could transfer the QObject tree over the network. Even transferring rather complex data would be a breeze.<\/p><p>And it\u2019s not limited to using JSON. Using for example XML would be possible as well.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Writing a save and load mechanism can be done using\u00a0QObject introspection\/reflection. <\/p>\n","protected":false},"author":4,"featured_media":1881,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[94],"tags":[103,95],"class_list":["post-2598","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-da","tag-json-da","tag-qt-da"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Serializing\/deserializing a QObject tree - Viking Software A\/S<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Serializing\/deserializing a QObject tree - Viking Software A\/S\" \/>\n<meta property=\"og:description\" content=\"Writing a save and load mechanism can be done using\u00a0QObject introspection\/reflection.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/\" \/>\n<meta property=\"og:site_name\" content=\"Viking Software A\/S\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-12T12:55:47+00:00\" \/>\n<meta name=\"author\" content=\"Maria Lisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Maria Lisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/\"},\"author\":{\"name\":\"Maria Lisberg\",\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/#\\\/schema\\\/person\\\/9b67e226302628047186fd9359931e56\"},\"headline\":\"Serializing\\\/deserializing a QObject tree\",\"datePublished\":\"2016-12-12T12:55:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/\"},\"wordCount\":351,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.vikingsoftware.com\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/Serializing-e1620043899553.jpg\",\"keywords\":[\"JSON\",\"Qt\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/\",\"url\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/\",\"name\":\"Serializing\\\/deserializing a QObject tree - Viking Software A\\\/S\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.vikingsoftware.com\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/Serializing-e1620043899553.jpg\",\"datePublished\":\"2016-12-12T12:55:47+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/#\\\/schema\\\/person\\\/9b67e226302628047186fd9359931e56\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.vikingsoftware.com\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/Serializing-e1620043899553.jpg\",\"contentUrl\":\"https:\\\/\\\/www.vikingsoftware.com\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/Serializing-e1620043899553.jpg\",\"width\":1650,\"height\":647},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/blog-da\\\/serializing-deserializing-a-qobject-tree\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Serializing\\\/deserializing a QObject tree\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/#website\",\"url\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/\",\"name\":\"Viking Software A\\\/S\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.vikingsoftware.com\\\/da\\\/#\\\/schema\\\/person\\\/9b67e226302628047186fd9359931e56\",\"name\":\"Maria Lisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b8b13978f2a67726c7f50acfc73600aa7902481eec9fb6673919cfaf3db353b8?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b8b13978f2a67726c7f50acfc73600aa7902481eec9fb6673919cfaf3db353b8?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b8b13978f2a67726c7f50acfc73600aa7902481eec9fb6673919cfaf3db353b8?s=96&d=mm&r=g\",\"caption\":\"Maria Lisberg\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Serializing\/deserializing a QObject tree - Viking Software A\/S","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/","og_locale":"da_DK","og_type":"article","og_title":"Serializing\/deserializing a QObject tree - Viking Software A\/S","og_description":"Writing a save and load mechanism can be done using\u00a0QObject introspection\/reflection.","og_url":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/","og_site_name":"Viking Software A\/S","article_published_time":"2016-12-12T12:55:47+00:00","author":"Maria Lisberg","twitter_card":"summary_large_image","twitter_misc":{"Skrevet af":"Maria Lisberg","Estimeret l\u00e6setid":"2 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/#article","isPartOf":{"@id":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/"},"author":{"name":"Maria Lisberg","@id":"https:\/\/www.vikingsoftware.com\/da\/#\/schema\/person\/9b67e226302628047186fd9359931e56"},"headline":"Serializing\/deserializing a QObject tree","datePublished":"2016-12-12T12:55:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/"},"wordCount":351,"commentCount":0,"image":{"@id":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/#primaryimage"},"thumbnailUrl":"https:\/\/www.vikingsoftware.com\/wp-content\/uploads\/2021\/05\/Serializing-e1620043899553.jpg","keywords":["JSON","Qt"],"articleSection":["Blog"],"inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/","url":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/","name":"Serializing\/deserializing a QObject tree - Viking Software A\/S","isPartOf":{"@id":"https:\/\/www.vikingsoftware.com\/da\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/#primaryimage"},"image":{"@id":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/#primaryimage"},"thumbnailUrl":"https:\/\/www.vikingsoftware.com\/wp-content\/uploads\/2021\/05\/Serializing-e1620043899553.jpg","datePublished":"2016-12-12T12:55:47+00:00","author":{"@id":"https:\/\/www.vikingsoftware.com\/da\/#\/schema\/person\/9b67e226302628047186fd9359931e56"},"breadcrumb":{"@id":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/#primaryimage","url":"https:\/\/www.vikingsoftware.com\/wp-content\/uploads\/2021\/05\/Serializing-e1620043899553.jpg","contentUrl":"https:\/\/www.vikingsoftware.com\/wp-content\/uploads\/2021\/05\/Serializing-e1620043899553.jpg","width":1650,"height":647},{"@type":"BreadcrumbList","@id":"https:\/\/www.vikingsoftware.com\/da\/blog-da\/serializing-deserializing-a-qobject-tree\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.vikingsoftware.com\/da\/"},{"@type":"ListItem","position":2,"name":"Serializing\/deserializing a QObject tree"}]},{"@type":"WebSite","@id":"https:\/\/www.vikingsoftware.com\/da\/#website","url":"https:\/\/www.vikingsoftware.com\/da\/","name":"Viking Software A\/S","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.vikingsoftware.com\/da\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Person","@id":"https:\/\/www.vikingsoftware.com\/da\/#\/schema\/person\/9b67e226302628047186fd9359931e56","name":"Maria Lisberg","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/secure.gravatar.com\/avatar\/b8b13978f2a67726c7f50acfc73600aa7902481eec9fb6673919cfaf3db353b8?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b8b13978f2a67726c7f50acfc73600aa7902481eec9fb6673919cfaf3db353b8?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8b13978f2a67726c7f50acfc73600aa7902481eec9fb6673919cfaf3db353b8?s=96&d=mm&r=g","caption":"Maria Lisberg"}}]}},"_links":{"self":[{"href":"https:\/\/www.vikingsoftware.com\/da\/wp-json\/wp\/v2\/posts\/2598","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vikingsoftware.com\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vikingsoftware.com\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vikingsoftware.com\/da\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vikingsoftware.com\/da\/wp-json\/wp\/v2\/comments?post=2598"}],"version-history":[{"count":0,"href":"https:\/\/www.vikingsoftware.com\/da\/wp-json\/wp\/v2\/posts\/2598\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.vikingsoftware.com\/da\/wp-json\/wp\/v2\/media\/1881"}],"wp:attachment":[{"href":"https:\/\/www.vikingsoftware.com\/da\/wp-json\/wp\/v2\/media?parent=2598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vikingsoftware.com\/da\/wp-json\/wp\/v2\/categories?post=2598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vikingsoftware.com\/da\/wp-json\/wp\/v2\/tags?post=2598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}