Dot-Net
版本控制友好、可擴展的二進製文件格式
在我目前正在進行的項目中,需要將一個相當大的資料結構保存到磁碟(編輯:想想幾十 MB)。作為一個樂觀主義者,我認為這樣的問題必須有一個標準的解決方案;但是,到目前為止,我還沒有找到滿足以下要求的解決方案:
- .NET 2.0 支持,最好使用 FOSS 實現
- 版本友好(這應該解釋為:如果底層資料結構的更改很簡單,比如添加/刪除欄位,讀取舊版本的格式應該相對簡單)
- 能夠進行某種形式的隨機訪問,其中可以在初始創建後擴展部分數據,而無需反序列化到目前為止創建的集合(將其視為擴展中間結果)
- 節省空間和時間(鑑於此要求,XML 已被排除在選項之外)
到目前為止考慮的選項:
- XmlSerializer:由於 xml 序列化不滿足要求 3 和 4,因此被拒絕。
- SerializableAttribute : 不支持要求 2 和 3。
- Protocol Buffers :被關於大數據集的文件的判決拒絕了——因為這個評論建議在頂部添加另一個層,這將需要額外的複雜性,我希望由文件格式本身處理。
- HDF5,EXI:似乎沒有 .net 實現
- SQLite / SQL Server Compact 版本:手頭的資料結構將導致非常複雜的表結構,對於預期用途來說似乎太重了
- BSON:似乎不支持要求 3。
- 快速資訊集:似乎只有付費的 .NET 實現。
非常感謝任何建議或指示。此外,如果您認為上述任何資訊不正確,請提供指針/範例以證明我錯了。
您是否考慮過使用SQL Server Compact Edition?
- 它有大量的 .NET 支持
- 模式的版本控制以及新版本應用程序處理舊模式的能力將完全由您控制。除了使用舊版本中不存在的新版本中的功能的應用程序之外,SQL Server Compact 的版本控制應該有點無縫。
- 您擁有可用於查詢的大部分 SQL 語法。
- 顯然,從名稱來看,這個版本的 SQL Server 是為嵌入式系統設計的,其中可以包括想要避免安裝 SQL Express 或 SQL Server 完整版本的應用程序。
現在,這將與 SQLite 存在相同的問題,因為您告訴我們的資料結構可能會變得複雜,但即使您使用自己的二進制格式也是如此。
順便說一句,我突然想到你還沒有澄清“相當大”的確切含義。如果“相當大”意味著接近或超過 4 GB,那麼顯然 SQL Compact 將不起作用,許多其他數據庫文件格式也不會起作用。
編輯我注意到您在我的文章之後已將 SQL Compact Edition 添加到您的“重量級”列表中。SQL Compact 僅需要 5MB 的 RAM 和 2MB 的磁碟儲存,具體取決於數據庫的大小。所以,問題不可能是重量級的。現在,關於聲稱資料結構的第二點將非常複雜。如果這是真的,我懷疑任何關係數據庫產品都是如此,並且滾動您自己的二進制格式將更加複雜。鑑於此,您可能會查看非關係數據庫產品,例如mongodb。