2012-05-04 62 views
0

我一直在尋找一個解決方案,爲此一小會兒,而不是我發現相當匹配的東西。 C#有一個內置的序列化庫,但這不是我所期望的。我需要序列化對象,以便可以將它們序列化,並將頭數據附加到數據包即。 ID號,時間戳,對象類型等,然後能夠發送出去,而不必記住我發送給它的平臺。換句話說,我應該能夠用C++或Java解開我的數據包,而不用比我投入的對象類型和頭數據的順序更多的知識。 C#中的二進制格式化程序會產生一個問題,因爲它被設計爲使用相同的庫在另一端進行反序列化。它還會產生我不想處理的臃腫數據包。我寧願格式化我的數據包。字節轉換的確切對象,類似於C#中的memcpy

| ======== | ======== | ========= | === | ===== ========= |

| packetID |數據類型| timeStamp | etc | serializedObject |

| ======== | ======== | ========= | === | ============= = |

如果我有權訪問memcpy的某些內容以實現此目的,那將會很好,因爲只要對象的數據類型順序被反序列化爲匹配(是的,假設其他語言具有相同的字節大小的數據類型),很容易從一個新的平臺上抓取來自服務器的數據(比如我想抓取Android(Java)或iPhone(obj。C)的數據),而且很少麻煩

+4

爲什麼不使用XML或JSON? – svick

+0

我對使用XML的理解是,它增加了大量的數據包膨脹。由於服務器充當中央集線器,在服務器執行其他任務時將大量數據包提供給大量設備可能會迅速產生大量擁塞。這是一個很好的解決方案,但是我會用一臺很老的機器來運行它,所以即使是一些客戶也可以爲它做很多工作。 –

+1

你也可以使用BSON或protobuf-net ... –

回答

3

I'已經使用Google's protocol buffers效果很好。它體積小,速度快,跨平臺,向後兼容,並且可以序列化爲二進制格式。它不支持您正在查找的自定義標題信息,但如果您可以構建自己的數據包,則可以根據需要將自定義標題添加到二進制流中。 Protobuf可以編譯成C#,iOS,Java和C++。

+0

我似乎找不到這個的C#變體。 「使用各種語言 - Java,C++或Python」。 –

+0

Jon Skeet在這裏寫下了它的一個端口:http://code.google.com/p/protobuf-csharp-port/和Marc Gravel在這裏有一個版本http://code.google.com/p/protobuf- net/ –

+0

有沒有辦法獲得對象的直接字節/二進制表示的方式,它被保存在RAM中?感謝您的鏈接!比特轉換器應該做到這一點,但它添加了一堆垃圾。 –