2012-03-20 19 views
2

我正在研究一個項目,該項目最終將涉及總計數十億個字段的Java對象,並且一些後臺計算表明,標準序列化技術將很快變得難以處理(例如20個演出JSON文件)。有沒有其他可供選擇的技術?有沒有一種標準/發達的方式來序列化Java類,以便在C++中使用而不使用XML或JSON等標記格式?

+0

你肯定會需要兩個流序列化和轉移。 20演出?讓人驚訝。 – Perception 2012-03-20 19:54:26

+0

幾十億*字段?即使所有這些都是「int」,我們都在談論幾千兆字節的數據(10億次32位= 3.7吉比特)。你*可以*通過丟棄冗餘(這也意味着錯誤檢測/修正!),永久性獨立性,漂亮性等來相當大地減少空間需求,但它不是靈丹妙藥。 – delnan 2012-03-20 19:57:39

+1

承租人...你想要一種「標準化」的方式在兩種語言之間進行非常差的數據交換,這兩種語言無法正常工作,並且能夠很好地協同工作。 – 2012-03-20 20:08:43

回答

1

我可能會使用Sun的XDR格式。它是二進制的,因此圖的三分之一大小是基於文本格式的大小作爲大小的起點。雖然他們不是(據我所知)包含在Java發行版中,但有幾個庫可以在Java和C++中生成/讀取這種格式。由於它在Sun的ONC RPC中使用,協議(以及至少某些庫實現)多年來都經過嚴格測試。它在RFC 4506中也是標準化的,所以你可以像你認爲的那樣獨立於Oracle。

+0

有趣......我肯定會研究這一點。非常感謝。 – pg1989 2012-03-20 20:17:13

0

您可以爲您的Java對象編寫自定義實現Serializable

+0

我們會走這條路線,但我們需要儘可能地維護原始Java程序的體系結構。根本不觸及Java代碼庫是最佳的。 – pg1989 2012-03-20 20:17:02

+0

@ pg1989 - 你知道,如果你真的解釋你的要求,它會有所幫助。 – 2012-03-20 21:47:43

+0

你們有我所有的細節。這是一個長期研究項目的即將到來的一部分,所以我自己並不知道每一個細節。 – pg1989 2012-03-20 23:32:29

1

看看protocol buffer 如果你有對象的集合,並且你不希望單個消息(比如一個大的XML),它可能會工作。

1

可以定義一些ASN.1語法和代碼/使用共同編碼規則即DER,PER等

這種靈活的符號在通過TCP最常用的協議,如LDAP中使用解碼數據。它可能是溝通不同平臺的最有效方式,但您必須學習一些asn.1基礎知識並定義語法。然後在Java和C++中實現marshallers/unmarshallers。

Check ASN.1 in Wikipedia

Check also Bouncy Castle

0

你可以嘗試ASN.1(是的,我知道別人認爲這已經在這裏,但我有一些額外的信息添加)。由於您關心的是數據的大小,請注意,電話運營商使用ASN.1來處理他們的CDR(呼叫數據記錄)以處理電話呼叫(無論是通過陸上線路還是移動電話)。他們將數百或數千個通話記錄捆綁到一條傳送到他們計費中心的消息中。

我的建議是使用最初爲航空業設計的PER(壓縮編碼規則),因爲它們需要儘量減少空對地通信中的帶寬。 PER隨後被移動電話行業所採用,目前它是許多3G和4G協議的一部分。

PER的目標是避免通過雙方通信雙方都知道的信息。例如,如果一個字段具有固定長度,則不需要在消息中發送該長度。如果一個值有一個範圍,例如5000到5007,那麼只有8個可能的值,所以只有3個比特被用來表示該值。這是PER實現這種緊湊性的一部分。

最後,使用優秀的ASN.1工具使您無需關心上一段中提到的細節。所有你需要做的就是創建描述你想要交換的信息的ASN.1規範(這很容易做 - 見ASN.1 Made Simple),選擇你的編程語言(C,C++,Java,C#是一些常用的,但也有一些ASN.1工具可用),然後使用ASN.1編譯器爲您生成序列化器/解串器引擎。請注意,因爲ASN。1本身獨立於您使用的編程語言,您可以輕鬆地使用C++進行序列化,並使用Java進行反序列化,反之亦然。

你可以找到ASN.1工具列表(一些免費的,一些商業)以下網址:http://www.itu.int/ITU-T/asn1/links/index.htm

+0

非常感謝,我有很多想想哈哈。 – pg1989 2012-03-23 17:23:08

相關問題