我正在使用protobuf將大對象序列化爲二進制文件進行反序列化並在以後再次使用。但是,當我反序列化一些較大的文件時,我遇到了問題。該文件是大約2.3〜GB的大小,當我嘗試反序列化他們,我得到一些例外拋出(按以下順序):反序列化大文件時的Protobuf異常
- 子消息不正確讀取
- 無效的導線型;這通常意味着你覆蓋了一個文件而不會截斷或設置長度;請參見Using Protobuf-net, I suddenly got an exception about an unknown wire-type
- 源數據中的意外結束組;這通常意味着源數據已損壞
我已經查看了第二個異常中引用的問題,但似乎沒有涵蓋我遇到的問題。
我使用的是微軟的HPC包來生成這些文件(他們需要一段時間),所以序列化看起來是這樣的:
using (var consoleStream = Console.OpenStandardOutput())
{
Serializer.Serialize(consoleStream, dto);
}
而且我讀文件如下:
private static T Deserialize<T>(string file)
{
using (var fs = File.OpenRead(file))
{
return Serializer.Deserialize<T>(fs);
}
}
這些文件是兩種不同的類型。一個大小約1GB,另一個約2.3GB。較小的文件都可以工作,較大的文件不會。任何想法可能在這裏出錯?我意識到我沒有給出很多細節,可以根據要求提供更多細節。
*反序列化*和* 2.3 GB *已經聽起來不對。無視錯誤,使用任何種類的序列化來處理這麼大量的數據是不好的。你能詳細說明你正在試圖通過使用序列化解決什麼問題嗎? – Sinatr
@Sinatr是的,我已經意識到可能這不是最好的路線,但我現在有文件試圖挽救他們。我需要能夠生成這些文件並將它們保存到磁盤供以後使用。 – geekchic
有什麼用?你能準確地告訴這些文件是什麼嗎?也許你決定使用序列化或其他方式來傳輸(導出/導入?)數據,其中序列化(對於這樣的數據量)是一個壞主意。考慮使用自定義文件格式,那麼大量數據(HPC包?這是什麼?)只是被複制到1,而小部分(包含配置,路徑,參數等)是以經典方式序列化,然後與大量數據。 – Sinatr