كيفية الاختيار بين protobuf-csharp-port و protobuf-net

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

  •  22-09-2019
  •  | 
  •  

سؤال

لقد اضطررت مؤخرًا إلى البحث عن عملية نقل C# لمكتبة المخازن المؤقتة البروتوكول التي تم تطويرها في الأصل بواسطة Google. وتخمين ما ، لقد وجدت مشروعين يمتلكان كلاهما شخصين معروفين هنا: protobuf-csharp-port, ، كتب بواسطة جون سكيت و protobuf-net, ، كتب بواسطة مارك جافيل. سؤالي بسيط: أي واحد يجب أن أختاره؟

أحب حل مارك تمامًا كما يبدو لي أقرب إلى C# philisophy (على سبيل المثال ، يمكنك فقط إضافة سمات إلى خصائص الفئة الموجودة) ويبدو أنها يمكن أن تدعم .NET أنواع مدمجة مثل System.Guid.

أنا متأكد من أن كلاهما مشاريع رائعة حقًا ولكن ما هو شابك؟

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

المحلول

وأنا أتفق مع نقاط جون. إذا كنت ترميز على بيئات متعددة ، فإن نسخته تمنحك واجهة برمجة تطبيقات مماثلة للتطبيقات "الأساسية" الأخرى. يشبه Protobuf-Net أكثر بكثير من كيفية تنفيذ معظم مسلسلات .NET ، لذلك يكون أكثر دراية (IMO) بـ .NET Devs. وكما يلاحظ جون - الإخراج الثنائي الخام ينبغي كن متطابقًا حتى تتمكن من إعادة التنفيذ باستخدام واجهة برمجة تطبيقات مختلفة إذا كنت بحاجة إلى ذلك لاحقًا.

بعض النقاط إعادة protobuf-net محدد لهذا التنفيذ:

  • يعمل مع موجود الأنواع (وليس فقط أنواع من .proto)
  • يعمل تحت أشياء مثل WCF و memcached
  • يمكن استخدامها للتنفيذ ISerializable للأنواع الموجودة
  • يدعم الميراث* وتسلسل أساليب رد الاتصال
  • يدعم الأنماط الشائعة مثل ShouldSerialize[name]
  • يعمل مع الأنواع المزينة الحالية (XmlType/XmlElement أو DataContract/DataMember)-المعنى (على سبيل المثال) أن نماذج LINQ إلى SQL تسلسلها خارج الصندوق (طالما تم تمكين التسلسل في DBML)
  • في V2 ، يعمل لأنواع POCO دون أي سمات
  • في V2 ، يعمل في .NET 1.1 (لست متأكدًا من أن هذه ميزة بيع ضخمة) ومعظم الأطر الأخرى (بما في ذلك Monotouch - Yay!)
  • ربما (لم يتم تنفيذها بعد) قد يدعم V2 التسلسل الكامل* (وليس التسلسل فقط للشجرة)

(*= تستخدم هذه الميزات بنسبة 100 ٪ Protobuf Binary ، ولكن قد يكون من الصعب استهلاكها من لغات أخرى)

نصائح أخرى

هل تستخدم لغات أخرى في مشروعك أيضًا؟ إذا كان الأمر كذلك ، فسيسمح لك منفذ C# بكتابة رمز مماثل على جميع الأنظمة الأساسية. إذا لم يكن الأمر كذلك ، فمن المحتمل أن يكون منفذ مارك أكثر تصفيحًا C# للبدء به. (حاولت جعل الكود الخاص بي "يشعر" مثل C#Normal ، لكن التصميم يعتمد بوضوح على رمز Java لتبدأ به ، حتى يكون مألوفًا لأولئك الذين يستخدمون Java أيضًا.)

بالطبع أحد جمال هذا هو أنه يمكنك تغيير رأيك لاحقًا وأن تكون واثقًا من أن جميع بياناتك ستظل صالحة من خلال المشروع الآخر - يجب أن تكون متوافقة تمامًا (من حيث البيانات المسلسل) ، بقدر أنا "م يدرك.

وفقا لذلك موقع مشروع جيثب protobuf-csharp-port تم طي الآن في مشروع مخازن بروتوكول Google الرئيسية, ، لذلك سيكون التنفيذ الرسمي .NET لـ Protobuf 3. Protobuf-Net كان آخر تحديث في عام 2013, ، على الرغم من أنه كان هناك بعض الالتزامات مؤخرًا في جيثب.

لقد تحولت للتو من protobuf-csharp-port إلى protobuf-net لأن:

  • Protobuf-Net هو أكثر ".NET LIKE" ، أي واصفات لأعضاء Serialise بدلاً من توليد الكود.
  • إذا كنت ترغب في تجميع ملفات protobuf-csharp-port .proto ، فعليك القيام بعملية من خطوتين ، أي ترجمة مع protoc إلى .protobin ثم تجميع ذلك باستخدام protogen. Protobuf-net يفعل هذا في خطوة واحدة.

في حالتي ، أريد استخدام المخازن المؤقتة للبروتوكول لاستبدال نموذج اتصال يعتمد على XML بين عميل .NET وخلفية J2EE. بما أنني أستخدم بالفعل توليد الكود ، فسأذهب لتنفيذ جون.

بالنسبة للمشاريع التي لا تتطلب Java interop ، سأختار تطبيق Marc ، خاصة وأن V2 يسمح بالعمل بدون تعليقات.

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