Protobuf-Netni MonoTouch bilan qanday ishlatish kerak?

Kimdir buni amalga oshira olganmi?

I tried the approach suggested here, but no matter how i generate the precompiled serializer, mtouch fails to copy it to the app bundle, thus resulting in a runtime exception. I think this happens because the resulting binary may not be compatible with MonoTouch.

Men quyidagilarni sinab ko'rdim:

1) Oldindan tayyorlangan seriyali fayl yaratish uchun eng so'nggi (shu vaqtning o'zida r450) tuzilgan iOS va Mono ikkiliklaridan foydalanardim.

2) MonoTouch uchun yaratilgan ikki xil assembleyalarni ishlab chiqarish uchun manba kodini ishlatardim. Birinchi qurilma FEAT_SAFE, MONOTOUCH, NO_RUNTIME va FEAT_SAFE belgilaridan foydalanib qurilgan MONOTOUCH; FEAT_COMPILER belgilaridan foydalanilgan. Men MONOTOUCH belgisini aniqladim va uni MONODROID belgisi bilan bir xil ishlatilgan (protobuf-net manbasida CallbackAttribute.cs va Helpers.cs fayliga qarang).

Men bu ikkita assembayni ishlatib, simulyatorda MonoTouch dasturidan precompiled serializer yaratishga harakat qildim.

Lekin precompiled serializerning qaysi versiyasidan foydalanmasligimdan qat'iy nazar, mtouch-ning chiqarilishi bilan o'rnatish hali ham ilova to'plamiga qo'shilmaydi: "Ogohlantirish:" MyLibrary.dll "kutubxonasidagi dastur paketida yo'q, kontentni olib bo'lmaydi" Buni mening kodimga havola qilaman .

2
Bunga "ko'p" "ha" xabarlarni eshitdim (ya'ni, MonoTouch-da muvaffaqiyatli ishlatish). Afsuski, buni to'g'ridan-to'g'ri tekshirolmayman, chunki menda yomg'ir yo'q.
qo'shib qo'ydi muallif Marc Gravell, manba
@alexb biroz kattaroq, lekin men bir necha kishilar bilan muomala qilardim bu erga (faqatgina keltirilmaganlar) va elektron pochta orqali menda raqam mavjud (lekin men ularni almasha olmaysiz). Men apparatdagi o'zgarishlar tufayli hozirgi holatni tasdiqlay olmayapman.
qo'shib qo'ydi muallif Marc Gravell, manba
Iltimos, bugzilla.xamarin.com saytidagi xato hisobotini to'ldiring va foydalanadigan halqani biriktiring (ya'ni, bu yig'ilishga havola qilinayotgan va ishlatilgan, lekin bu yerga ishlov berishdan bosh tortish kerak).
qo'shib qo'ydi muallif poupou, manba
Protobufni qo'llash uchun sizning arizangizning talabi bormi yoki siz faqat umumiy serializatsiya yechimini izlayapsizmi? Men json.net saytiga o'tishdan oldin, protobufni ishlashga harakat qiladigan qator ketma-ketliklashtirish strategiyasini ishga tushirdim. Buni ham mijoz, ham server tomonida ishlatib, juda murakkab sinflarni muvaffaqiyatli ketma-ket o'tkazdim.
qo'shib qo'ydi muallif competent_tech, manba
- Poupou qila oladi - Marc meni iloji boricha ishlayotgan odamga ko'rsatishi mumkinmi?
qo'shib qo'ydi muallif AlexB, manba
@competent_tech JSON aslida umumiy maqsadimiz ketma-ketlash formatidir. Shu bilan birga, ba'zi bir maxsus senaryolar uchun protokol kerak, bu erda biz MQTT yordamida real vaqt ma'lumotlarini (masalan, GPS manzilini) yuborishimiz kerak
qo'shib qo'ydi muallif AlexB, manba

3 javoblar

Oxir-oqibat men uni oldim. Aslida assotsiatsiya nomi mtouchni o'z ichiga olgan fayl nomidan farq qilganda, uni dastur paketiga kiritmaydi. Bu mening ishimda sodir bo'ldi. Men shunday yig'ildim:

model.Compile("Taxi.ProtoBufSerializers.MQTTContractsSerializer", "MQTTContractsSerializer.dll");

Shunday qilib, Protobuf-Net protsessor nomini ushbu usulning birinchi parametriga o'rnatib, ikkinchi parametr bilan berilgan fayl nomiga saqlaydi, shuning uchun mtouch dastur paketiga qo'shilmaydi.

Biroq, mening ismimni saqlamoqchi edim, shuning uchun Protobuf-Netning manba kodi bilan shu kabi yig'ilishni yaratdim:

  • Fayl yo'li: Ikkinchi parametr sifatida berilgan;
  • Assambleya nomi: Path.GetFileNameWithoutExtension (yo'l);
  • Module nomi: Path.GetFileName (yo'l).

Men hozirda yo'lda hech qanday tekshiruvlarni amalga oshirmayapman, ammo buning uchun hali kerak emas.

Va voila: Namuna simulyator va qurilmada ishlaydi.

Va nihoyat, bu mtouch o'zini tutish kerakmi, yoki bu xato bo'lsa, bilmayman. Biroq, men unga qarshi xato haqida xabar beraman.

3
qo'shib qo'ydi
Iltimos, xato haqida hisobotni to'ldiring :) va BTW siz o'z javobingizni "javob" deb belgilashingiz mumkin, shuning uchun SO orqali izlanayotgan har bir kishi so'ragan savol uchun echim topishi mumkin.
qo'shib qo'ydi muallif poupou, manba

Men simulyator ustida ishlashim uchun uni faqatgina olganman. VS.NET-2010da maxsus ketma-ketliklashtiruvchi assotsiatsiyani yaratdim. Men yaratgan IL/DLLning noto'g'ri nom maydoni bo'lganligi sababli bitta muammo bo'ldi. Men shunday qildim:

model.Compile("X.Y.Serializer.MySerializer", "X.Y.Serializer.dll")

Biroq, IL shunga o'xshash edi:

.assembly X.Y.Serializer.MySerializer
{
   .hash algorithm 0x00008004
   .ver 0:0:0:0
}
.module X.Y.Serializer.MySerializer

Ie. sinf nomi montaj nomida bo'lgan.

Men Perl dasturini quyidagicha yozdim:

  • Decompile DLL -> IL
  • Fix IL
  • Compile IL -> DLL

Bu erda:

#!/usr/bin/perl

# Usage: fix-protobuf-assembly assembly bad-namespace
#
# Example: fix-protobuf-assembly X.Y.Serializer.dll X.Y.Serializer.MySerializer
# X.Y.Serializer.MySerializer gets converted to X.Y.Serializer

use strict;
use File::Slurp;
use Cwd;

print "Current directory is " . getcwd() . "\n";
my $asm_file = shift || die "missing assembly file";
my $bad_ns = shift || die "missing namespace";

die "no such file '$asm_file'" if (! -f $asm_file);

my $il_file = $asm_file;
$il_file =~ s#dll$#il#;

Run("ildasm /out=$il_file $asm_file");
my $il = read_file($il_file) || die "error reading $il_file: $!";

my $ns = $bad_ns;
$ns =~ s#\.[^.]+$##;
if (($il =~ s#(\.assembly|module) $bad_ns#$1 $ns#g) == 0)
{
   die "$bad_ns not found in input dll; aborting";
}
write_file($il_file, $il);

Run("ilasm /dll $il_file");

sub Run
{
   my($command) = @_;

   warn "Running $command ...\n";
   system($command) && die "error running last command; bailing out";
}

Ehtimol, men Compile() ni chaqirish uchun to'g'ri yo'lni o'tkazib yuborganim yo'q va mening hackim keraksizdir.

Jamoa Windows va iOS simulyatorida yaxshi ishladi. Ammo keyinchalik JIT operatsion tizimida buzilish xatosini tuzdi. Men SO savol yaratdim:

JIT protobuf-net bilan xato tuzadi MonoTouch/iOS qurilmasi (iPhone/iPad)

Birinchi bo'lib seriyali yig'ilishni yaratish uchun Mac/w/standart konsol loyihasida MonoDevelop dan foydalanib harakat qildim. Ba'zi muammolar bor edi, lekin halol bo'lish uchun men uyqusirardim va xira bo'lib qoldim va u foydalanuvchi xatosi bo'lishi mumkin edi va loyiha men u erda rivojlanayotgan boshqa tarkibiy qismlarga ega bo'lgani uchun tezda Windowsga o'tishga qaror qildim.

Men Windows 4.0 .NET 4.0 loyihasidan foydalandim. Faqat ikkita MT-kutubxonaning engil versiyasini yaratishga majbur bo'ldim.

0
qo'shib qo'ydi
MonoTouch da ProtoBuf-Net uchun o'zi namuna yaratish uchun github.com/t9mike/ProtoBuf1 . Bu simulyator ustida ishlaydi, lekin qurilmada muammo bor. JIT protobuf bilan kompilyatsiya xatosi haqida batafsil ma'lumot MonetTouch/iOS qurilmasida (iPhone/iPad) .
qo'shib qo'ydi muallif t9mike, manba

Ha, biz XML-dan seriyali ish faoliyatini yaxshilash uchun 2012 yildan buyon loyihada foydalanmoqdamiz. Ko'pincha, biz RESTFul xizmatlaridan birida ba'zi fayllar uchun 1MB hajmida JSON qila olmadik. 2017 yilda bu erda JSONni har bir ob'ekt uchun maxsus serializers yaratishning qo'shimcha qiyinchiliklari o'rniga, biz uchun juda osonroq bo'ladi.

0
qo'shib qo'ydi