F#Serializeを識別型連合なぜこれほど多くのバイト?
-
19-09-2019 - |
質問
私は、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()
解決
唯一のオプションは、「自分でやる」ことであろうように、
にBinaryFormatterは、おそらくボックスのうち最も簡潔なフォーマッタです。
あなたは余分なオーバーヘッドを取得している理由は、シリアライズして保存された他のすべての情報に関係しています。シリアライズはちょうどそれにもメタデータを格納し、データを保存しません(例:タイプ、などのすべての)オブジェクト全体が安全に再構築することができるような方法インチこれは、オーバーヘッドを追加します。
データが大きくなるにつれて幸い、オーバーヘッドが実際に増加しません。あなたが2Kバイト配列を保存した場合、あなたはおそらく〜の代わりに〜2300バイトの3300バイトを取り戻すだろう - 。オーバーヘッドはほぼ一定でなければならないので、(変更されない種類の情報を提供)
所属していません StackOverflow