我正在尝试为UDP数据包流序列化一些数据,而且我从序列化中获得了巨大的开销。如果我使用1k Byte数组编码FileData,我会得到2312字节。如果不对自己进行编码和解码,我将如何减少这种开销?
[<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()
答案 0 :(得分:2)
BinaryFormatter可能是开箱即用的最简洁的格式化程序,因此唯一的选择是“自己动手”。
您获得额外开销的原因与序列化保存的所有其他信息有关。序列化不仅保存数据,还以一种可以安全地重建整个对象的方式存储元数据(即:所有类型等)。这增加了开销。
幸运的是,随着数据变大,开销并没有真正增加。如果你保存了一个2k字节的数组,你可能会得到~3300字节而不是~2300字节 - 因为开销应该接近常量(假设类型信息没有改变)。