سؤال

أحاول التحدث إلى برنامج 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؛أنواع متوافقة فقط.

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