F # Сериализует различимое объединение, зачем так много байтов?
-
19-09-2019 - |
Вопрос
Я пытаюсь сериализовать некоторые данные для потока пакетов UDP, и я получаю огромные накладные расходы от сериализации.Если я кодирую fileData массивом в 1 тыс. байт, я получаю обратно 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, вероятно, является самым кратким форматером из имеющихся в наличии, поэтому единственным вариантом было бы "сделать это самостоятельно".
Причина, по которой вы получаете дополнительные накладные расходы, связана со всей остальной информацией, сохраненной с помощью сериализации.Сериализация не просто сохраняет данные, она также сохраняет метаданные (т.Е.:все типы и т.д.) таким образом, чтобы весь объект мог быть безопасно реконструирован.Это увеличивает накладные расходы.
К счастью, накладные расходы на самом деле не увеличиваются по мере увеличения объема данных.Если бы вы сохранили массив в 2 тысячи байт, вы, вероятно, получили бы обратно ~ 3300 байт вместо ~ 2300 байт - поскольку накладные расходы должны быть почти постоянными (при условии, что информация о типе не меняется).