باستخدام GPB، كيف يمكنني أن أتوقف فصول التفاف عن قبول الرسائل الثنائية التي لا تهدف لهم؟

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

  •  16-09-2019
  •  | 
  •  

سؤال

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

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

عند تحميل المحتوى الثنائي للرسالة إلى فئة مجمع، كيف يمكنني أن أجعلها رمي خطأ إذا تم تمرير نوع الخطأ؟

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

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

المحلول 2

يبدو أن هذا هو ما يفعله الآخرون، أيضا، ويعمل بشكل جيد بالنسبة لي:

message TypedMessage {
    required string type = 1;
    required bytes payload = 2;
}

تذهب الرسالة الفعلية إلى حقل الحمولة في النموذج المسلح ويتم استخدام النوع للحصول على فئة Builder و Wrapper المناسبة. .

نصائح أخرى

إذا كانت البيانات التي تمر بها إلى MyMessage.ParseFrom () لا تمثل رسالة من هذا النوع، فستحصل على InvalidProtocolBufferExcepution. أليس هذا بما يكفي بالنسبة لك؟

رسائل PB ليست ذاتية تصفها، لذلك تحتاج إلى معرفة (من خلال بعض الوسائل) التي تحاول تحليلها. بالطبع، يمكنك محاولة تحليلها والتقاط InvalDProtoculBufferexcepution، ولكن هذا ليس لطيفا جدا. بدلا من ذلك، أعتقد أن معظم الناس يستخدمون النهج الذي تصفه: استخدم فئة رسالة أساسية مع حقل "نوع" (عادة Enum) وعدد من الحقول الاختيارية، واحدة لكل نوع من النوع الفرعي ممكن. يتيح لك ذلك تحليل الرسالة، ثم قم بتشغيل نوع الرسالة لاستخراج "الحمولة" الفعلية للرسالة.

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