2009-12-10 16 views
1

J'essaie de sérialiser certaines données pour un flux de paquets UDP et je reçois un énorme surcoût de la sérialisation. Si je code une FileData avec un tableau de 1k Byte, je récupère 2312 octets. Comment pourrais-je réduire cet overhead sans coder et décoder tout moi-même?F # Sérialiser Union discriminée pourquoi tant d'octets?

[<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() 

Répondre

2

BinaryFormatter est probablement la plus concise formatter de la boîte, de sorte que la seule option serait de « faire vous-même ».

La raison pour laquelle vous obtenez le surcoût supplémentaire concerne toutes les autres informations enregistrées avec la sérialisation. La sérialisation ne sauvegarde pas seulement les données, elle stocke également les méta-données (c'est-à-dire: tous les types, etc.) de manière à ce que l'objet entier puisse être reconstruit en toute sécurité. Cela ajoute des frais généraux.

Heureusement, la surcharge n'augmente pas vraiment à mesure que les données augmentent. Si vous sauvegardiez un tableau de 2k octets, vous obtiendriez probablement ~ 3300 octets au lieu des ~ 2300 octets - puisque le préfixe devrait être presque constant (à condition que les informations de type ne changent pas).

+0

Merci pour la réponse rapide. Peut-être que je devrais regarder dans les tampons proto pour dot net. – gradbot