سؤال

هل أي شخص لديه تجربة مع هذه المكتبات لديك أي تعليق على أي واحد أنها المفضل ؟ هل كانت هناك أي أداء الخلافات أو الصعوبات في استخدام ؟

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

المحلول

ولقد لعبت في جميع أنحاء قليلا مع كلا النظامين، لا شيء خطير، فقط بعض الاشياء hackish بسيطة، ولكن شعرت أن هناك فرقا حقيقيا في كيفية كنت من المفترض أن استخدام المكتبات.

ومع دفعة :: التسلسل، تكتب بنفسك البنيات / الطبقات أولا، ثم قم بإضافة طرق الأرشفة، ولكن كنت لا تزال تترك مع بعض جميلة الطبقات "ضئيلة"، والتي يمكن استخدامها كأعضاء البيانات، الموروثة، أيا كان .

ومع مخازن البروتوكول، وكمية من الشفرة التي تم إنشاؤها حتى لهيكل بسيط هو كبير جدا، والبنيات ورمز الذي تم إنشاؤه هو أكثر يعني لتعمل على، والتي تستخدمها وظائف مخازن بروتوكول "لنقل البيانات من وإلى الخاص هياكلها الداخلية.

نصائح أخرى

ولقد تم استخدام دفعة التسلسل لفترة طويلة وحفرت للتو في مخازن البروتوكول، واعتقد انهم لم يكن لديك نفس الغرض المحدد. BS (لا يرى أن المقبلة) يوفر بك C ++ الكائنات إلى تيار، في حين PB هو تنسيق تبادل أن تقرأ من /.

ونماذج بيانات PB هو طريقة أكثر بساطة: يمكنك الحصول على كل أنواع من [إينتس] والعوامات، سلاسل، المصفوفات، البنية الأساسية، وهذا الى حد كبير ذلك. BS يسمح لك بحفظ مباشرة كل من الأشياء الخاصة بك في خطوة واحدة.

وهذا يعني مع BS تحصل على المزيد من البيانات على السلك ولكن لم يكن لديك لإعادة بناء كل من بنية الأشياء الخاصة بك، في حين مخازن البروتوكول هو أكثر إحكاما ولكن هناك المزيد من العمل الذي يتعين القيام به بعد قراءة الأرشيف. وكما يقول اسم، هو واحد من أجل بروتوكولات (الملحد اللغة، والفضاء كفاءة مرور البيانات)، والآخر هو لالتسلسل (كائنات عدم التفكير إنقاذ).

وإذا ما هو أكثر أهمية بالنسبة لك: السرعة / كفاءة الفضاء أو رمز نظيفة

وهناك زوجين من مخاوف إضافية مع زيادة.التسلسل الذي سوف يضاف إلى المزيج.التحذير:ليس لدي أي خبرة مباشرة مع بروتوكول مخازن خارج القشط مستندات.

نلاحظ أنه في حين أعتقد دفعة ، وزيادة.التسلسل ، عظيم في ماذا يفعل, لقد جئت إلى استنتاج مفاده الافتراضي صيغ الأرشيف لأنه يأتي مع لا خيار كبير لكل من سلك الشكل.

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

إصدارات أحدث من دفعة.التسلسل قد لا تولد محفوظات الإصدارات القديمة يمكن إلغاء تسلسل. (فإن العكس ليس صحيحا:الإصدارات الأحدث دائما تهدف إلى إلغاء تسلسل المحفوظات التي قدمتها الإصدارات القديمة).وقد أدى هذا إلى المشاكل التالية لنا:

  • كل من عملائنا & برنامج خادم إنشاء تسلسل الكائنات الأخرى يستهلك لذا نحن يمكن أن تتحرك إلا إلى أحدث دفعة.التسلسل إذا كنا ترقية كل من العميل والخادم في ببراعة.(هذا هو تحد في بيئة حيث لم يكن لديك السيطرة الكاملة على العملاء).
  • دفعة يأتي المجمعة واحدة كبيرة مع مكتبة الأجزاء المشتركة و كل رمز التسلسل و أجزاء أخرى من دفعة مكتبة (مثلا ، shared_ptr) قد تكون في نفس الملف لا يمكنني ترقية أي أجزاء من دفعة لأنني لا أستطيع ترقية دفعة.التسلسل.أنا لست متأكدا مما إذا كان من الممكن/آمنة/عاقل محاولة رابط إصدارات متعددة دفعة واحدة للتنفيذ ، أو إذا كان لدينا الميزانية/الطاقة ريفاكتور بها الأجزاء التي تحتاج إلى البقاء على نسخة قديمة من دفعة إلى تنفيذي مستقل (DLL في حالتنا).
  • النسخة القديمة من دفعة نحن عالقون على لا يدعم أحدث إصدار من برنامج التحويل البرمجي نستخدمها ، لذلك نحن عالقون على نسخة قديمة من المترجم أيضا.

جوجل يبدو في الواقع نشر البروتوكول مخازن سلك شكل, و ويكيبيديا يصف لهم إلى الأمام-متوافقة إلى الوراء متوافقة (على الرغم من أنني أعتقد أن ويكيبيديا هي اشارة الى البيانات الإصدارات بدلا من بروتوكول العازلة مكتبة الإصدارات).في حين لم يكن أي من هذه هو ضمان توجيه التوافق ، يبدو أقوى دليل لي.

في الموجز ، وأود أن تفضل معروف, نشرت سلك شكل مثل بروتوكول المخازن المؤقتة عندما لا يكون لديك القدرة على ترقية العميل و الخادم في ببراعة.

حاشية:وقح المكونات لمدة ذات الإجابة من قبل لي.

دفعة التسلسل

  • مكتبة كتابة البيانات إلى تيار.
  • لا ضغط البيانات.
  • لا يدعم البيانات الإصدارات تلقائيا.
  • يدعم المحكمة الحاويات.
  • خصائص البيانات المكتوبة تعتمد على تيارات المختار (مثلا ، endian مضغوطة).

بروتوكول مخازن

  • يولد رمز من واجهة وصف (يدعم C++, Python و جافا بشكل افتراضي.C, C# وغيرها من قبل 3rd الطرف).
  • اختياريا يضغط البيانات.
  • يعالج البيانات الإصدارات تلقائيا.
  • مقابض endian مبادلة بين المنصات.
  • لا دعم المحكمة الخاصة بلبنان الحاويات.

دفعة التسلسل مكتبة لتحويل كائن إلى تسلسل تيار من البيانات.بروتوكول مخازن تفعل الشيء نفسه, ولكن أيضا القيام بأعمال أخرى (مثل الإصدارات و endian مبادلة).دفعة التسلسل هو أبسط من أجل "الصغيرة مهام بسيطة".بروتوكول مخازن هي على الأرجح أفضل "البنية التحتية الكبيرة".

تحرير:24-11-10:وأضاف "تلقائيا" إلى BS الإصدارات.

ليس لدي تجربة مع زيادة التسلسل, ولكن لقد استخدمت بروتوكول المخازن المؤقتة.أنا مثل بروتوكول مخازن الكثير.ضع ما يلي في الاعتبار (أقول هذا مع لا المعرفة دفعة).

  • بروتوكول مخازن هي فعالة جدا لذلك أنا لا تخيل أن يجري قضية خطيرة مقابلدفعة.
  • بروتوكول مخازن توفر التمثيل وسيطة تعمل مع لغات أخرى (بايثون جافا...وأكثر من ذلك في الأعمال).إذا كنت تعرف كنت فقط باستخدام C++, ربما دفعة هو أفضل, ولكن الخيار لاستخدام لغات أخرى لطيفة.
  • بروتوكول مخازن هي أكثر مثل البيانات حاويات...لا يوجد وجوه المنحى الطبيعة ، مثل الميراث.التفكير في هيكل ما تريد تسلسل.
  • بروتوكول مخازن هي مرنة لأنك يمكن أن تضيف "اختياري" الحقول.وهذا يعني أساسا يمكنك تغيير بنية البروتوكول العازلة دون كسر التوافق.

ويساعد هذا الأمل.

وboost.serialization يحتاج فقط مترجم C ++ ويعطيك بعض السكر جملة مثل

serialize_obj >> archive;
// ...
unserialize_obj << archive;

ولتوفير والتحميل. إذا C ++ هي اللغة الوحيدة التي تستخدمها يجب أن تعطي boost.serialization تسديدة خطيرة.

وأخذت نظرة سريعة على مخازن بروتوكول جوجل. من ما أراه وأقول لها لا يمكن مقارنتها مباشرة إلى boost.serialization. يجب عليك إضافة مترجم للملفات .proto إلى toolchain الخاص بك والحفاظ على ملفات .proto نفسها. ولا يشمل API إلى C ++ كما boost.serialization لا.

وboost.serialization لا وظيفة مصممة من أجل جيدا: إجراء تسلسل الكائنات C ++ :) OTOH و-API الاستعلام مثل مخازن بروتوكول جوجل قد يمنحك المزيد من المرونة.

ومنذ كنت فقط boost.serialization حتى الآن لا أستطيع التعليق على مقارنة الأداء.

تصحيح أعلاه (أعتقد أن هذا هو هذا الجواب) عن دفعة التسلسل :

أنها تسمح دعم بيانات الإصدارات.

إذا كنت بحاجة إلى ضغط - استخدام ضغط تيار.

يمكن التعامل مع endian مبادلة بين المنصات كما الترميز يمكن أن يكون النص ثنائي أو XML.

وأنا لم تنفذ أي شيء باستخدام مكتبة دفعة، ولكن وجدت لتكون أكثر مدروسة جوجل protobuff، وورمز أنظف بكثير وأسهل في القراءة. أود أن أقترح وجود نظرة في مختلف اللغات التي تريد استخدامها مع ولها قراءة خلال التعليمات البرمجية والوثائق وتجعل عقلك.

وكانت الصعوبة واحد كان لي مع protobufs سموا وظيفة تستخدم عادة للغاية في GetMessage الشفرة التي تم إنشاؤها على ()، والتي من الصراعات بالطبع مع الماكرو Win32 وGetMessage.

وما زال أنصح غاية protobufs. انهم مفيدة للغاية.

وكما هو الحال مع كل شيء تقريبا في مجال الهندسة وجوابي هو ... "الامر يتوقف".

ويتم اختبار كل جيدا والتكنولوجيات فحصها. كلا سوف تتخذ بياناتك وتحويلها إلى شيء مألوف لإرسال مكان. فإن كلا من المحتمل أن تكون سريعة بما فيه الكفاية، وإذا كنت تعول حقا بايت هنا أو هناك، وكنت ربما لن تكون سعيدة مع أي (دعونا نواجه الأمر على حد سواء الحزم التي تم إنشاؤها يكون جزء صغير من XML أو JSON).

وبالنسبة لي، انها حقا يأتي الى العمل وما إذا كنت بحاجة إلى شيء آخر غير C ++ على الطرف الآخر.

إذا كنت ترغب في معرفة محتويات الرسالة الأولى وكنت بناء النظام من الصفر، واستخدام بروتوكول المخازن. يمكنك التفكير في الرسالة بطريقة مجردة ومن ثم لصناعة السيارات في توليد رمز في أي لغة تريدها (هي الإضافات 3rd الطرف المتاحة للتو عن كل شيء). أيضا، أجد التعاون مبسطة مع بروتوكول المخازن. أنا فقط ارسال اكثر من ملف .proto ثم الفريق الآخر لديه فكرة واضحة عما يجري نقلها البيانات. أنا أيضا لا نفرض عليهم شيئا. اذا كانوا يريدون استخدام جافا، والمضي قدما!

إذا قمت بالفعل بنيت فئة في C ++ (وهذا ما حدث في كثير من الأحيان لا) وأريد أن إرسال البيانات عبر السلك الآن، زيادة الواضح التسلسل يجعل من نصف طن من معانيها (وخصوصا حيث لدي بالفعل دفعة التبعية في مكان آخر).

ويمكنك استخدام دفعة التسلسل بالتعاون الوثيق مع جهاز "حقيقية" كائنات المجال، وتسلسل هرمي كائن كامل (الميراث). Protobuf لا يدعم الميراث، لذلك سيكون لديك لاستخدام التجميع. ويقول الناس أن Protobuf ينبغي أن تستخدم لDTOs (كائنات نقل البيانات)، وليس للمجال الأساسية كائنات أنفسهم. لقد استخدمت كل من دفعة :: التسلسل وprotobuf. ينبغي أن تؤخذ في أداء دفعة :: التسلسل في الاعتبار، الحبوب قد تكون بديلا.

وأنا أعلم أن هذا هو أكبر سنا السؤال الآن, ولكن أنا فكرت رمي بلدي 2 بنس في!

مع دفعة تحصل على فرصة أنا أكتب بعض التحقق من صحة البيانات في فئات ؛ وهذا أمر جيد لأن تعريف البيانات و التحقق من صحة كل شيء في مكان واحد.

مع الباوند أفضل ما يمكنك فعله هو وضع تعليقات في .بروتو الملف و أمل ضد الأمل في أن من يستعمله يقرأ عليه ، يدفع الانتباه إلى ذلك ، تنفذ من صحة الشيكات أنفسهم.

وغني عن القول أن هذا غير وارد ولا يمكن الاعتماد عليها إذا كان الاعتماد على شخص آخر في الطرف الآخر من تيار الشبكة للقيام بذلك بنفس القوة نفسه.بالإضافة إلى ذلك إذا قيود على صلاحية تغيير رمز التغييرات متعددة تحتاج إلى التخطيط والتنسيق القيام به.

وبالتالي أنا أعتبر الباوند غير ملائمة للتطورات حيث هناك فرصة ضئيلة بانتظام الالتقاء والتحدث مع جميع أعضاء الفريق.

==تعديل==

الشيء الذي أعنيه هو هذا:

message Foo
{
    int32 bearing = 1;
}

الآن من الذي يقول ما مدى صالحة bearing ؟ ونحن يمكن أن يكون

message Foo
{
    int32 bearing = 1;  // Valid between 0 and 359
}

ولكن هذا يعتمد على شخص آخر في هذه القراءة و الكتابة رمز لذلك.على سبيل المثال, إذا قمت بتحرير ذلك القيد يصبح:

message Foo
{
    int32 bearing = 1;  // Valid between -180 and +180
}

أنت تعتمد اعتمادا كليا على كل من يستخدم هذا .بروتو تحديث التعليمات البرمجية الخاصة بهم.التي لا يمكن الاعتماد عليها ومكلفة.

على الأقل مع زيادة التسلسل أنت توزيع واحد فئة C++, و التي يمكن أن يكون لها صحة البيانات الشيكات يبنى الحق في ذلك.إذا كانت تلك القيود تغيير, ثم لا أحد بحاجة إلى القيام بأي عمل آخر من التأكد من أنهم يستخدمون نفس نسخة من كود المصدر كما كنت.

البديل

هناك بديل:ASN.1.هذا قديم ولكن لديه بعض حقا الأمور المفيدة:

Foo ::= SEQUENCE
{
   bearing INTEGER (0..359)
}

ملاحظة القيد.لذلك كلما أي شخص يستهلك هذا .asn ملف يولد رمز أنهم في نهاية المطاف مع التعليمات البرمجية التي سوف تحقق تلقائيا أن bearing هو في مكان ما بين 0 و 359.إذا قمت بتحديث .asn الملف ،

Foo ::= SEQUENCE
{
   bearing INTEGER (-180..180)
}

كل ما عليك القيام به هو إعادة ترجمة.أي رمز آخر التغييرات المطلوبة.

يمكنك أيضا القيام:

bearingMin INTEGER ::= 0
bearingMax INTEGER ::= 360

Foo ::= SEQUENCE
{
   bearing INTEGER (bearingMin..<bearingMax)
}

ملاحظة <.و أيضا في معظم الأدوات bearingMin و bearingMax يمكن أن تظهر الثوابت في التعليمات البرمجية التي تم إنشاؤها.هذا هو مفيدة للغاية.

القيود يمكن أن تكون معقدة جدا:

Garr ::= INTEGER (0..10 | 25..32)

انظر الفصل 13 في هذا PDF;أنه لأمر مدهش ما يمكنك القيام به ؛

المصفوفات يمكن أن تكون مقيدة جدا:

Bar ::= SEQUENCE (SIZE(1..5)) OF Foo
Sna ::= SEQUENCE (SIZE(5)) OF Foo
Fee ::= SEQUENCE 
{
    boo SEQUENCE (SIZE(1..<6)) OF INTEGER (-180<..<180)
}

ASN.1 قديمة الطراز, ولكن لا يزال المتقدمة بنشاط ، تستخدم على نطاق واسع (الهاتف المحمول الخاص بك يستخدم الكثير), و أكثر مرونة بكثير من معظم تقنيات التسلسل.عن نقص الوحيد الذي أستطيع أن أرى أنه لا يوجد لائق مولد رمز الثعبان.إذا كنت تستخدم C/C++, C#, Java, ادا فأنت من خليط من الحرة (C/C++, ADA) والتجارية (C/C++, C#, JAVA) أدوات.

أنا لا سيما مثل خيارات واسعة من ثنائي على أساس النص wireformats.هذا يجعلها مريحة للغاية في بعض المشاريع.على wireformat قائمة تضم حاليا:

  • البر (ثنائي)
  • في (ثنائي ، الانحياز محاذاتها.هذا هو الترا بت كفاءة.على سبيل المثال ، عدد صحيح مقيدة بين 0 و 15 سوف يستغرق فقط 4 bits على السلك)
  • OER
  • دير (ثنائي آخر)
  • XML (أيضا XER)
  • سلمان (العلامة التجارية الجديدة أداة دعم لا يزال النامية)

بالإضافة إلى آخرين.

ملاحظة آخر اثنين ؟ نعم ، يمكنك تحديد هياكل البيانات في ASN.1 وتوليد التعليمات البرمجية ، وتنبعث منها / تستهلك رسائل XML و JSON.ليس سيئا بالنسبة التكنولوجيا التي بدأت مرة أخرى في 1980s.

الإصدار يتم بشكل مختلف الباوند.يمكنك أن تسمح ملحقات:

Foo ::= SEQUENCE
{
   bearing INTEGER (-180..180),
   ...
}

وهذا يعني أنه في وقت لاحق يمكنني أن أضيف إلى Foo, و الأنظمة القديمة التي لديك هذا الإصدار يمكن أن لا تزال تعمل (ولكن يمكن فقط الوصول إلى bearing الميدان).

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

روابط أخرى:

ملاحظات

تبادل البيانات:

  • رمز أول النهج (على سبيل المثالدفعة التسلسل) تقييد لك إلى اللغة الأصلية (مثلا ، C++) ، أو إجبار لك أن تفعل الكثير من العمل الإضافي في لغة أخرى
  • المخطط الأول هو الأفضل, ولكن
    • الكثير من هؤلاء ترك ثغرات كبيرة في تبادل العقد (أيلا قيود).الباوند هو مزعج في هذا الصدد ، لأنه على خلاف ذلك جيد جدا.
    • بعض القيود (مثلXSD, JSON) ، ولكن تعاني مكتمل أداة الدعم.
    • على سبيل المثال, مايكروسوفت xsd.exe بنشاط يتجاهل القيود في xsd ملفات (MS عذر حقا ضعيفة).XSD هو جيد (من قيود وجهة نظر), ولكن إذا كنت لا تثق شخص استخدام جيد XSD الأداة التي يفرض عليها بالنسبة له/لها ثم قيمة XSD هو تقلص
    • سلمان المصادقون موافق, لكنها لا تفعل شيئا لمساعدتك على شكل JSON في المقام الأول و لا ما يسمى تلقائيا.هناك أي ضمان بأن شخص ما يرسل لك سلمان رسالة تشغيله من خلال المصادقة.عليك أن تتذكر أن التحقق من ذلك بنفسك.
    • ASN.1 أدوات جميعا يبدو أن تطبيق قيود التحقق.

لذلك بالنسبة لي, ASN.1 يفعل ذلك.انها واحدة وهذا هو الأقل احتمالا أن يؤدي إلى شخص آخر خطأ ، لأنه واحد مع ميزات حيث الأدوات كل على ما يبدو تسعى إلى تنفيذ كامل تلك الميزات ، و هو لغة محايدة بما فيه الكفاية بالنسبة لمعظم الأغراض.

أن نكون صادقين, إذا الباوند وأضاف القيود الآلية التي سيكون الفائز.XSD قريب ولكن الأدوات عالميا تقريبا القمامة.إذا كانت هناك لائقة المولدات رمز من لغات أخرى ، JSON المخطط سيكون جيد جدا.

إذا الباوند قد القيود المضافة (ملاحظة:هذا لن يغير أي من سلك صيغ), سيكون هذا الشخص أنصح الجميع تقريبا كل غرض.على الرغم من ASN.1 uPER مفيد جدا وصلات لاسلكية.

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