幾個月前,我實現了一個通過UDP網絡接收數據的組件,通過Boost :: Serialization將其反序列化,並開始使用傳入對象。Boost Serialization - 在反序列化已損壞的數據時沒有archive_exception?
經過一段時間的使用這個組件後發生隨機崩潰,當我發現有人正在向我的UDP端口發送數據時我可以解決這個問題。
我通過簡單地增加一個try/catch圍繞反序列化解決了這個問題:
try
{
boost::archive::text_iarchive inputArchive(incomingData);
inputArchive >> givenElements; //the actual deserialization, here the exception has been thrown in the past
}
catch(boost::archive::archive_exception& ex)
{
std::cout << "Archive Exception during deserializing:" << std::endl;
std::cout << ex.what() << std::endl;
std::cout << "Incoming data had the following content:" << std::endl;
std::cout << dataStream.str() << std::endl;
}
上面的代碼整理出任何外國/損壞的數據通過網絡進來的,只是反序列化它的意思是什麼數據。
那時我在一臺Linux機器上使用了較舊的Boost版本(我不太清楚,1.44,1.42?)。
目前我必須在Windows XP機器上再次使用該組件,並使用相當新的Boost 1.46.1。 現在的問題是,try/catch似乎不再過濾外部/損壞的數據。至於來自該代碼的內容傳入,我的應用程序崩潰,沒有任何錯誤消息。
我無法更改正在監聽的端口。除此之外,我想創建一個忽略數據的健壯應用程序,它不能使用而不是崩潰。
我現在想知道是否有人有一個想法,爲什麼會出現這種效應? Boost已經變得越來越不穩健?這是什麼與操作系統?我不知道並希望這是一個問題,可以回答「進入Boost」。
你說得對。也許我應該在Boost數據前添加自己的頭文件。這樣我可以發送一些散列,大小信息等數據,並確保一切按預期工作。 – MOnsDaR
這實際上並不是我的問題的正確答案,但它告訴我們如何解決潛在的問題。如果對這個問題有更多的答案,我會改變「正確答案」 - 標誌。謝謝! – MOnsDaR