2017-02-18 42 views
10

我想檢查proto buffer是否是我使用的最好的序列化程序,我的研究發現沒有其他的東西接近。 我正在研究java後端和android(java)移動應用程序,但是有可能在不太遙遠的未來創建其他客戶端,所以我想要跨平臺的東西。 數據結構的草圖:proto緩衝區的侷限性 - 加載部分數據和共享字符串

message All { 
    repeated Line lines = 1; 
    Common common = 2; 
} 

有一對夫婦數百行的對象,每一行是相當複雜的,需要自行〜100 KB。

兩個問題我看到原緩衝 - 在應用程序啓動時,我需要對現有數據的只是一部分 - 只是「普通」和「行」的基本信息。是否可以加載部分數據? - 每個Line對象都包含數百個字符串,但在幾個Line對象中會出現相同的字符串,所以我想盡力在這些對象之間共享它們。它可能在原型buf級別上,還是需要成爲應用程序級別的一部分?

謝謝!

+0

您是否考慮過使用多個分隔郵件? –

+0

「是否可以加載部分數據」否。您需要將它們存儲在單獨的消息中。 –

+0

我會認定:您可以跳過部分有線格式的協議緩衝區,因爲消息的大小是已知的。但是這聽起來像是你必須閱讀'Line'消息才能確定要閱讀的相關內容。也許你可以有另一個領域,比如'重複Line basic_lines';但你仍然需要編寫一個自定義解析器來提取你感興趣的東西。 –

回答

0

從您提供的有限規格中,很難給出適當的反饋。你說,對於你的問題,最好的解決方案似乎是protobuf,但我們不能從所給的信息中重新評估。根據你寫的內容,我甚至會說,一個簡單的GZIPped字節數組(或大多數JSON是可打印的(你說他們是String s))可能對你更好(「重用」了很多東西跨線對象=> GZIP將搖滾)。

正如其他人所說:使用protobuf是不可能加載「部分數據結構」(實際上你不會是一個部分數據結構,只要「重複」部分是例如Collection,因爲protobuf將採取關心在結構中分段數據)。

我會把我的兩美分放在GZIPped JSON流(例如,與傑克遜),當然在這種情況下,你會減少帶寬與CPU週期的成本。

+1

你是對的,我應該擴展我的爲了證明我的要求,我應該儘快這樣做。然而,我有幾點不同意你的觀點:字節數組是我目前的方法,我可以告訴你,這實際上不會擴展,並且非常容易出錯。我計劃gzip protobuf的結果,所以json會變得更大。加上在舊手機上反序列化json會增加顯着的延遲(CPU週期),再加載同一個字符串的多個副本會增加內存壓力。我的結構也有多維數組,這會佔用json比protobuf多得多的空間。 – MichalMa

+0

與傑克遜也有可能使用對象引用⇒相同的字符串將不會在編組字符串中兩次;) 但是,我同意,它確實取決於你的確切用例。 –

0

回答我自己關於加載部分數據的問題。我還沒有在實踐中嘗試過,但我不知道下面是行不通的:

message All { 
    repeated Line lines = 1; 
    Common common = 2; 
} 

message All_partial { 
    Common common = 2; 
} 

正如proto3所有領域都是可選的,我們可以有我們的結構的第二個定義,「部分」領域。如果我們保持相同的字段編號,我希望我們會沒事的。