2011-10-25 37 views
2

我有一些序列化邏輯,我也序列化stl數據結構。目前我只是通過遍歷它來編寫大小字段,然後寫入結構的每個元素。在反序列化中,我讀取size字段,然後知道何時完成讀取數據結構。是迭代器:: difference_types系統獨立

沒有問題是如何正確編寫大小字段和系統獨立。目前我使用std::iterator_traits<const_iterator>::difference_type作爲存儲在文件中的類型。但是我不確定,如果這種類型保證獨立於系統,或者可能會改變,當我嘗試在不同系統之間交換文件時。

我看過std::string這種類型,在這種情況下,sizeof(std::iterator_traits<std::string::const_iterator>::difference_type)在64位機器上返回8。所以我想在這種情況下,這只是一個size_t的typedef,它佔用了一個字。我目前沒有可用的32位機器,因此我無法檢查其大小是否與此不同。

這是由標準保證是可移植的,還是我應該使用一些固定類型的所有數據結構來編碼長度?

回答

2

這是由標準保證是便攜式,還是我應該使用一些固定類型的所有數據結構來編碼長度?

不,它不可移植,是的,你應該使用一些固定大小的類型。對於大多數應用程序,一個32位整數應該沒問題。請注意,根據您的序列化代碼和可移植性要求,您還可能面對字節順序問題(小端和大端)。

有關更多信息和最佳做法,請參閱Qt QDataStream的文檔。 Qt的人建議決定一個固定大小的整數類型(如qint32),然後在序列化時適當地轉換。

+0

好吧,我會在這裏使用一個固定大小的類型,以確保它可以跨平臺使用。我已經考慮了字節順序問題,所以我將在這裏使用一個小的無符號整數類型。所有其他類型完全符合簽名和大小,所以這不會是一個問題。 – LiKao

3

所有這些類型定義的全部意義在於你做了而不是需要全局修復類型!

對於序列化,您必須決定並修復您的序列化格式。在這一點上,你可能只是要求大小適合一個32位整數,測試給定的大小是否和轉換。如果出現錯誤,可以讓序列化失敗(例如「數據結構不可序列化」)。如果您認爲有必要,請將尺寸字段設置爲64位,並且您應該有足夠的餘地,但是您需要權衡空間與靈活性和使用情況。你真的會擁有超過40億個元素的容器並將它們寫入磁盤嗎?

序列化是關於制定決策和發佈處方,你必須忍受並考慮到導入和導出失敗的可能性。

2

difference_type由標準定義爲一個「符號整數類型」(20.1.5,表32)和需要爲ptrdiff_t類型(20.1.5/4),而這又是一個typedef實現定義(5.7/6)。

由於這裏的共同點是它可以轉換爲「有符號整數類型」,所以如果你需要序列化這個值,我建議static_cast把它看作long之類的東西並保存。