.net F#序列化区分并集为什么有这么多字节?

.net F#序列化区分并集为什么有这么多字节?,.net,serialization,overhead,.net,Serialization,Overhead,我正在尝试序列化UDP数据包流的一些数据,而序列化会带来巨大的开销。如果我用1k字节数组编码一个文件数据,我会得到2312字节。如果不自己对所有内容进行编码和解码,我将如何减少这种开销 [<Serializable>] type Response = | FileSize of String * int64 | FileData of int64 * byte[] with static member Decode(packet : byte[]) =

我正在尝试序列化UDP数据包流的一些数据,而序列化会带来巨大的开销。如果我用1k字节数组编码一个文件数据,我会得到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()
[]
类型响应=
|字符串*int64的文件大小
|int64*字节[]的文件数据
具有
静态成员解码(数据包:字节[])=
使用ms=新内存流(数据包)
设bf=new BinaryFormatter()
反序列化(毫秒)
|>拆开
成员:this.Encode()=
使用ms=newmemoryStream()
设bf=new BinaryFormatter()
bf.序列化(ms,此)
GetBuffer女士()

BinaryFormatter可能是最简洁的格式化程序,所以唯一的选择是“自己动手”

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


幸运的是,开销并没有随着数据的增大而增加。如果您保存了一个2k字节的数组,您可能会返回约3300字节而不是约2300字节,因为开销应该接近常量(前提是类型信息不变)。

感谢您的快速回复。也许我应该研究一下网络的原型缓冲区。