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()
Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top