F# Serialize Discriminated Union, зачем так много байтов?

Я пытаюсь сериализовать некоторые данные для потока пакетов 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()

person gradbot    schedule 10.12.2009    source источник


Ответы (1)


BinaryFormatter, вероятно, самый лаконичный форматировщик из коробки, поэтому единственным вариантом будет «сделать это самостоятельно».

Причина, по которой вы получаете дополнительные накладные расходы, связана со всей другой информацией, сохраняемой при сериализации. Сериализация не просто сохраняет данные, она также сохраняет метаданные (т. е. все типы и т. д.) таким образом, чтобы можно было безопасно реконструировать весь объект. Это добавляет накладные расходы.

К счастью, накладные расходы не увеличиваются по мере увеличения объема данных. Если бы вы сохранили массив размером 2 КБ, вы, вероятно, вернули бы ~ 3300 байтов вместо ~ 2300 байтов, поскольку накладные расходы должны быть почти постоянными (при условии, что информация о типе не меняется).

person Reed Copsey    schedule 10.12.2009
comment
Спасибо за быстрый ответ. Может быть, мне следует изучить протобуферы для сети точек. - person gradbot; 11.12.2009