protobuf-net - backticks والقواميس وملفات .proto
-
22-09-2019 - |
سؤال
أحاول التحدث إلى برنامج C# يستخدم protobuf-net من جهاز iPhone يستخدمه http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers
لسوء الحظ، يتضمن ملف .proto الذي تلقيته (تم إنشاؤه من كود مصدر C#) سطرًا يرفضه protoc:
repeated Pair_Guid_List`1 Local = 6;
يبدو أن السبب في ذلك هو أن البيانات المصدر عبارة عن قاموس C#، مع مفتاح Guid وفئة كقيمة.هل هناك طريقة للتعامل مع هذا بشكل أفضل؟
إصدار protobuf-net المستخدم هو r278.zip.
(إن إرسال واستقبال هذه النماذج الأولية في C# يعمل بشكل جيد، فقط عندما نضيف iPhone إلى المزيج تصبح هذه مشكلة.)
تحديث:كل شيء يعمل الآن بفضل مارك!
تبين أن الكائن الموجود على جانب C# هو:
[ProtoMember(7)]
public Dictionary<Guid, List<Pages>> ReceivedPages { get; set; }
والتي عملت بشكل جيد باستخدام ما يلي في .proto:
message PagesDict {
required bcl.Guid guid = 1;
repeated Pages Pages = 2;
}
مع الرسالة المعنية التي تحتوي على:
repeated PagesDict ReceivedPages = 7;
المحلول
أولاً - هل تحاول استخدام protobuf-net على اي فون؟من غير المتوقع أن يعمل الإصدار 1 عبر اللمس الأحادي؛الإصدار 2 يفعل العمل (كان ذلك محركًا كبيرًا لعمل الإصدار الثاني)، ولكن لم يتم إصداره بعد (إنه قابل للاستخدام ولكنه غير مكتمل في الوقت الحالي).اسمحوا لي أن أعرف إذا كنت تحاول القيام بذلك، لأنه سيكون مهما؛-p
أتوقع أنهم حصلوا على .proto عن طريق الاتصال Serializer.GetProto<T>
, ، وهو للأسف ليس مضمونًا، خاصة عندما تكون هناك أشياء مثل Dictionary<,>
متورطون (سأضيف TODO لمحاولة إصلاح ذلك في الإصدار الثاني).
والخبر السار هو أنه نماذج Dictionary<TKey,TValue>
مثل repeated someType
, ، أين someType
يجب ان يكون:
message someType {
required keyType key = 1;
required valueType value = 2;
}
و Guid
على غرار bcl.Guid
(bcl.proto)، وهو:
message Guid {
optional fixed64 lo = 1; // the first 8 bytes of the guid
optional fixed64 hi = 2; // the second 8 bytes of the guid
}
ومع ذلك، لاحظ أنه ليست هناك حاجة إلى "النموذج الأولي". على الاطلاق إذا كنت تعمل على .NET-to-.NET؛أنواع متوافقة فقط.