F # Сериализует различимое объединение, зачем так много байтов?

StackOverflow https://stackoverflow.com/questions/1884755

  •  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 байт - поскольку накладные расходы должны быть почти постоянными (при условии, что информация о типе не меняется).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top