2016-08-10 97 views
1

我一直在尋找能夠序列化完全未知對象的東西。序列化未知對象

我知道Qt擁有一個serialization功能,還與qvariant對象。這是否意味着我可以將任何複雜的對象傳遞給QVariant(即也有指針和/或指針循環的東西)並序列化該對象?

它似乎也boost::any isn't supported by serialization

這是不可能的,因爲在C++中缺少反射而沒有編寫我自己的特定類型序列化例程?

+0

「未知對象」是什麼意思?你能用一個你想達到的例子來編輯你的問題嗎? – wasthishelpful

+0

@wasthishelpful'未知對象'意味着'未知對象'..它可以是任何類型的C++對象,你可以在github上找到你選擇的任何項目。 – Dean

+0

這不是未知的,那是未定義的,也許未申報的:)這就是爲什麼我要求一個例子說明你希望你的最終代碼是如何工作的,從編譯器的角度弄清楚你的未知方法 – wasthishelpful

回答

1

是的,要編寫自己的序列化代碼是不可能的,因爲C++沒有反射。你幾乎已經明白了。

+0

所以序列化一個qvariant將不會工作? – Dean

+0

QVariant只是一個不同類型的聯合,但如果你使用自定義類型,你仍然需要告訴Qt它。看看這個教程http://www.bogotobogo.com/Qt/Qt5_QVariant_meta_object_system_MetaType.php – jwernerny

0

雖然C++沒有反射,但如果您使用QObject和Qt Property System,則可以在Qt中獲得有限的反射。

編寫代碼來序列化和反序列化任何QObject的所有屬性是相當容易的。 [提示:有一些方法可以檢索QObject的所有屬性。]這裏的權衡是你希望序列化的所有東西都必須是一個QObject(而QObject不能有拷貝構造函數),並且你的getter和setter必須使用屬性。用一些聰明的宏,從編碼的角度來看,這並不是太大的問題。

1

只要您期望QVariant攜帶的所有類型的QDataStream運算符都已定義,您就可以序列化任何QVariant。所以,對於你自己的自定義類型,你需要有這些操作符,然後它會正常工作。