1

我正在尝试为 UDP 数据包流序列化一些数据,并且我从序列化中获得了巨大的开销。如果我用 1k 字节数组对 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()
4

1 回答 1

2

BinaryFormatter 可能是开箱即用的最简洁的格式化程序,所以唯一的选择是“自己做”。

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

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

于 2009-12-10T23:13:30.357 回答