F # تسلسل الاتحاد التمييز لماذا الكثير من بايتس؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

أحاول تسلسل بعض البيانات لتيار حزمة UDP وأنا أحصل على نفقات هائلة من التسلسل. إذا قمت بتشفير Filedata مع صفيف بايت 1K أعود 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 أكثر فصيلة موجزة خارج الصندوق، لذلك سيكون الخيار الوحيد هو "القيام بذلك بنفسك".

السبب في الحصول على النفقات العامة الإضافية له علاقة بكل المعلومات الأخرى المحفوظة باستخدام التسلسل. لا يقوم Serializing فقط بحفظ البيانات، كما أنه يخزن بيانات التعريف (أي: جميع الأنواع، وما إلى ذلك) بطريقة يمكن إعادة بناء الكائن بأكمله بأمان. هذا يضيف النفقات العامة.

لحسن الحظ، فإن العلبة العامة لا تزيد حقا حيث تصبح البيانات أكبر. إذا قمت بحفظ صفيف بايت 2K، فمن المحتمل أن تعود إلى ~ 3300 بايت بدلا من البايتات ~ 2300 - نظرا لأن النفقات العامة يجب أن تكون بالقرب من ثابت (شريطة عدم تغيير معلومات النوع).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top