1

UDP パケット ストリームのデータをシリアル化しようとしていますが、シリアル化によって大きなオーバーヘッドが発生しています。FileData を 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()
4

1 に答える 1

2

BinaryFormatter は、おそらくすぐに使用できる最も簡潔なフォーマッタであるため、唯一のオプションは「自分で行う」ことです。

余分なオーバーヘッドが発生する理由は、シリアル化で保存される他のすべての情報に関係しています。シリアル化はデータを保存するだけでなく、オブジェクト全体を安全に再構築できる方法でメタデータ (つまり、すべての型など) も保存します。これにより、オーバーヘッドが追加されます。

幸いなことに、データが大きくなってもオーバーヘッドは実際には増加しません。2k バイトの配列を保存した場合、(型情報が変わらない限り) オーバーヘッドがほぼ一定であるため、おそらく 2300 バイトではなく 3300 バイトが返されます。

于 2009-12-10T23:13:30.357 に答える