هل يجب علي استخدام ملف ثنائي أو نصي لتخزين رسائل Protobuf؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

باستخدام Google Protobuf، أحفظ بياناتي المستفعة المرضية إلى ملف - في كل ملف هناك عدة رسائل. لدينا كلا من إصدارات C ++ و Python من التعليمات البرمجية، لذلك أحتاج إلى استخدام وظائف Protobuf المتوفرة باللغتين. لقد جربت باستخدام Serializetoarray و SerializeasString ويبدو أن هناك الشروط المؤسفة التالية:

  1. Serializetoarray: كما هو مقترح في إجابة واحدة، فإن أفضل طريقة لاستخدامها هي بادئة كل رسالة مع حجم البيانات. هذا سيعمل بشكل رائع ل C ++، ولكن في بيثون لا يبدو أنه ممكن - هل أنا مخطئ؟

  2. SerializeasString: يقوم هذا بإنشاء سلسلة متسلسلة تعادل نظيره الثنائي - الذي يمكنني حفظه في ملف، ولكن ما يحدث إذا كان أحد الأحرف في نتيجة التسلسل هو n - كيف نجد نهايات خط، أو نهاية الرسائل هذا الأمر؟

تحديث:

اسمحوا لي أن أعيد صياغة قليلا. كما أفهمها، لا يمكنني كتابة بيانات ثنائية في C ++ لأن تطبيق Python الخاص بنا لا يمكن قراءة البيانات، حيث يمكن أن تحليل الرسائل المتنقلة السلسلة فقط. يجب أن استخدم ثم بدلا من ذلك SerializeAsString في كل من C ++ والبيثون؟ إذا كانت الإجابة بنعم، فهل من أفضل الممارسات تخزين هذه البيانات في ملف نصي بدلا من ملف ثنائي؟ شعوري الأمعاء هو ثنائي، ولكن كما ترون هذا لا يبدو وكأنه خيار.

هل كانت مفيدة؟

المحلول

أفضل الممارسات لتزويل الرسائل بهذه الطريقة هي الإعداد لكل رسالة بحجمها. بهذه الطريقة التي تقرأ بها في الحجم (جرب 32 بت int أو شيء ما)، ثم قرأت هذا العدد من البايتات في المخزن المؤقت والتحيز عليه. ثم اقرأ الحجم التالي، إلخ.

الشيء نفسه ينطبق على الكتابة، يمكنك كتابة حجم الرسالة أولا، ثم الرسالة نفسها.

يرى تدفق رسائل متعددة في وثائق Protobuf لمزيد من المعلومات.

نصائح أخرى

لدينا نجاح رائع Base64 ترميز الرسائل، واستخدام رسائل Simple n لفصل الرسائل. هذه الإرادة تعتمد الكثير على استخدامك - نحتاج إلى تخزين الرسائل في ملفات "السجل". بطبيعة الحال لديها ترميز العلامة العامة / فك تشفير هذا - ولكن هذا لم يكن حتى عن بعد مشكلة بالنسبة لنا.

تتمثل ميزة إبقاء هذه الرسائل كنص منفصل في الخط حتى الآن حتى لا تقدر بثمن للصيانة والتصحيح. معرفة عدد الرسائل الموجودة في ملف؟ wc -l وبعد ابحث عن رسالة NTH - head ... | tail. وبعد اكتشف ما هو الخطأ في سجل على نظام بعيد تحتاج إلى الوصول إلى 2 VPN وحل Citrix؟ انسخ معجون الرسالة والبريد إلى المبرمج.

Protobuf هو تنسيق ثنائي، لذلك يجب أن يتم القراءة والكتابة كثنائي، وليس نص. إذا كنت لا تريد تنسيق ثنائي، يجب عليك التفكير في استخدام شيء آخر غير Protobuf (هناك الكثير من تنسيقات البيانات النصية، مثل XML، JSON، CSV)؛ مجرد استخدام تجريدات النص لا يكفي.

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