2009-12-10 36 views
1

我試圖序列化UDP數據包流的一些數據,我從序列化中獲得了巨大的開銷。如果我使用1k字節數組對FileData進行編碼,則返回2312字節。如果我自己不編碼和解碼所有內容,我將如何減少此開銷?F#序列化區分聯盟爲什麼這麼多字節?

[<Serializable>] 
type Response = 
    | FileSize of String * int64 
    | FileData of int64 * byte[] 
with 
    static member Decode(packet : byte[]) = 
     use ms = new MemoryStream(packet) 
     let bf = new BinaryFormatter() 
     bf.Deserialize(ms) 
     |> unbox<Response> 

    member this.Encode() = 
     use ms = new MemoryStream() 
     let bf = new BinaryFormatter() 
     bf.Serialize(ms, this) 
     ms.GetBuffer() 

回答

2

BinaryFormatter可能是開箱即用的最簡潔的格式程序,所以唯一的選擇就是「自己動手」。

你得到額外開銷的原因是與序列化保存的所有其他信息有關。序列化不僅可以保存數據,還可以以一種可以安全重建整個對象的方式存儲元數據(即:所有類型等)。這增加了開銷。

幸運的是,隨着數據變大,開銷並不會增加。如果你保存了一個2k字節的數組,你可能會得到約3300字節而不是〜2300字節 - 因爲開銷應該接近恆定(只要類型信息不變)。

+0

感謝您的快速回復。也許我應該看看dot net的proto緩衝區。 – gradbot 2009-12-10 23:34:18