F# serialize União discriminada Por que tantos bytes?
-
19-09-2019 - |
Pergunta
Estou tentando serializar alguns dados para um fluxo de pacotes UDP e estou recebendo uma enorme sobrecarga da serialização. Se eu codificar um arquivo arquivado com uma matriz de 1k bytes, retribuirei 2312 bytes. Como eu reduziria essa sobrecarga sem codificar e decodificar tudo sozinho?
[<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()
Solução
O BinaryFormatter é provavelmente o formatador mais conciso que sai, portanto, a única opção seria "fazer você mesmo".
A razão pela qual você está obtendo a sobrecarga extra tem a ver com todas as outras informações salvas com serialização. A serialização não apenas salva os dados, também armazena os meta -dados (ou seja: todos os tipos, etc.) de uma maneira que todo o objeto possa ser reconstruído com segurança. Isso adiciona sobrecarga.
Felizmente, a sobrecarga não aumenta à medida que os dados aumentam. Se você salvou uma matriz de 2k bytes, provavelmente retornaria ~ 3300 bytes em vez dos ~ 2300 bytes - uma vez que a sobrecarga deve estar quase constante (desde que as informações de tipo não mudem).