F#Serialize Discriminated Union为什么这么多字节?

时间:2009-12-10 23:09:18

标签: .net serialization overhead

我正在尝试为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()

1 个答案:

答案 0 :(得分:2)

BinaryFormatter可能是开箱即用的最简洁的格式化程序,因此唯一的选择是“自己动手”。

您获得额外开销的原因与序列化保存的所有其他信息有关。序列化不仅保存数据,还以一种可以安全地重建整个对象的方式存储元数据(即:所有类型等)。这增加了开销。

幸运的是,随着数据变大,开销并没有真正增加。如果你保存了一个2k字节的数组,你可能会得到~3300字节而不是~2300字节 - 因为开销应该接近常量(假设类型信息没有改变)。