2014-04-04 25 views
0

我很新的穀物,和我有一個(可能簡單)的問題:穀物 - 多個反序列化

有沒有辦法來反序列化多個對象時,我不知道里面物體的數量(XML)檔案?

我想是這樣的:

std::ifstream is("c:\\data.xml"); 
cereal::XMLInputArchive archive(is); 

while (is.good() && !is.eof()) 
{    
    try{ 
     ObjectIn oIn; 
     archive(oIn); 
     objectList.push_back(oIn); 
    } 
    catch (exception e){ 
    } 
} 

比方說,我在XML文件和XML在3個對象,我收到了不包含對象數量。因此,在我的代碼中,前3次迭代都正常,但第4次生成 「CerealTest.exe中0x0035395E處未處理異常:0xC0000005:訪問衝突讀取位置0x00000018」。

你有什麼建議嗎?

+1

歡迎來到StackOverflow。如果可能的話,你應該在啓用調試的情況下進行編譯,以便你可以用行號發佈一個異常。並解釋您嘗試過的內容(請參閱http://stackoverflow.com/help/how-to-ask) –

回答

2

在嘗試回答你的問題之前,讓我問你一個問題:如果你正在序列化未知數量的物品,爲什麼不把這些物品放置在一些容器中以容納可變數量的物品?您可以使用std::vector來存儲您的ObjectIn,並輕鬆處理其中的任意數量。您的代碼看起來是這樣的:

std::vector<MyObjects> vec; 
{ 
    cereal::XMLInputArchive ar("filename"); 
    ar(vec); 
} // get in the habit of using cereal archives in an RAII fashion 

上述工程與任意數量的序列化對象的,假設穀物產生的開始與XML。您甚至可以在XML代碼中添加或刪除矢量中的元素,並且它可以正常工作。


如果你在閱讀一些未知數量的對象,而不是將它們放置在設計容納可變數量元素的容器堅持,你可以把它像這樣(但是要注意,這不是一個好主意 - 你確實應該嘗試改變你的系列化戰略,並不能做到這一點):

{ 
    cereal::XMLInputArchive ar("filename"); 
    try 
    { 
    while(true) 
    { 
     ObjectIn ob; 
     ar(ob); 
     objectList.push_back(oIn); 
    } 
    catch(...) 
    { } 
} 

讓我再次強調,這是從根本上與你的序列化的戰略問題,你應該不是序列化項目一拉的容器如果你不知道會有多少人上面的代碼不能處理任何其他的讀取,它只是試圖盲目地閱讀事情,直到遇到異常。如果您的對象遵循某種命名模式,則可以使用名稱 - 值對(cereal::make_nvp)按名稱檢索它們。

+0

您好,非常感謝您的回答。 試圖序列一個std ::向量或std ::列表生成以下錯誤: 「錯誤\t \t 10錯誤C2338:試圖序列的不可序列化的類型與輸出存檔\t .. \ SRC \包括\穀類\ cereal.hpp \t 453「 – Metallaru

+0

此外,try/catch沒有工作,它只是引發了很多」第一次機會例外......訪問衝突讀取位置...「 – Metallaru

+1

如果您序列化列表或向量需要在類型文件夾中包含適當的頭文件。 – Azoth