Jag försöker att tjäna en fastighetslista med sökresultat till min iPhone-app. Servern är en prototyp, skrivet i Python. Först fann jag Pythons inbyggda plistlib, vilket är fantastiskt. Jag vill ge ett skott i sök-som-du-typ, så jag behöver den vara så liten som möjligt, och xml var för stor. Det binära plistformatet verkar vara ett bra val. Tyvärr gör plistlib inte binära filer, så gå rakt upp PyObjC. (Segue: Jag är väldigt öppen för alla andra tankar om hur man utför live-sökning. Jag har redan matchat data så mycket som möjligt, inklusive bara att visa tillräckligt med resultat för att fylla fönstret med iPhone-tangentbordet upp, vilket är 5.) Tyvärr, även om jag känner till Python och blir ganska anständig med kakao, får jag fortfarande inte PyObjC. Det här är kakaoekvivalenten av vad jag vill göra: Jag trodde jag skulle kunna göra något så här, men dataWithPropertyList är inte i NSPropertyListSerialization objects dir () listningen. Jag borde också förmodligen konvertera listan till NSArray. Jag försökte PyObjC-dokumenten, men det var så tangentiellt för mitt verkliga arbete som jag trodde Id försök också SO SOS. Så här läser jag i plist på iPhone-sidan. Gärna att klargöra om något av detta inte är meningsfullt. Property ListBinary Formatet för binär egenskapslista är ett av flera format som har använts för plistfiler. standardmedlet för applikationer under operativsystem som härstammar från NeXTSTEP (inklusive nuvarande Apple-operativsystem) för att lagra konfigurationsdata. Det binära formatet introducerades mer nyligen än de andra formaten, men är nu standard för Apples system. Formatbeskrivning Tillgängliga typer Följande typer finns i en binär plist: singleton (boolean, null, fyll) heltal float datum binär data singel byte sträng dubbelbyte sträng UID array ordlista Filsektioner En binär plistfil har fyra sektioner: De första 8 byte är en identifierare, lika med bplistXX där XX är två siffror. bplist00 och bplist01 är kända, jag vet inte skillnaderna. För det andra är alla element i pläkten kodade och sammanfogade. För det tredje är sammanställningen av förskjutningarna av alla element i pläkten, varvid varje förskjutning ges som ett osignerat heltal i ett fast antal byte. Ett objekt i plåstret har ett referensnummer som är baserat på 0-baserad indexering av denna tabell, t. ex. Objektnummer 0 är objektet i förskjutningen som ges först i denna tabell. De sista 32 byte, släpvagnssektionen. De slutliga 32 byte av en binär plist har följande format: 6 byte x00 vadderar ett 1 byte heltal vilket är antalet byte för ett offsetvärde. Giltiga värden är 1, 2, 3 eller 4. Offsetvärden kodas som unsigned, big endian heltal. Måste vara tillräckligt bred för att koda offset för offsetbordet, inte bara den högsta objektförskjutningen. ett 1 byte heltal som är antalet byte för ett objektreferensnummer. Giltiga värden är 1 eller 2. Referensnummer kodas som unsigned, big endian heltal. 4 byte x00 vadderar ett 4 byte heltal vilket är antalet objekt i plistan 4 byte av x00 vadderar ett 4 byte heltal som är referensnumret för rotobjektet i plistan. Detta är vanligtvis noll. 4 byte x00 vadderar ett 4 byte heltal som är offset i filen i början av förskjutningstabellen, som nämns ovan som det tredje elementet i en binär plist Objektkodning Kodningen av tillgängliga typer är följande: De första fyra bitarna är ett id-nummer för objekttypen enligt följande kartläggning: 0x0 singleton 0x1 heltal 0x2 float 0x3 datum 0x4 binär data 0x5 single byte sträng 0x6 dubbel byte sträng 0x8 UID 0xa array 0xd ordbok De andra fyra bitarna är storleken på objektet . Om det angivna värdet är 15 betyder det att den sanna objektstorleken är större än vad som kan uttryckas i fyra bitar. I det här fallet är nästa byte början på den sanna storleken, kodad som heltalobjekten, förutom att värdet är osignerat. Det här är inte fallet för 0x0 typobjekt, men se nedan för detaljer. Jag kommer att referera till detta värde som objektlängden. Kodningen för återstoden av objektet varierar efter typ. Bytelängden är antalet byte som används vid kodning av objektet, utan att räkna kodningen av typidentifikationsnumret och objektlängden som redan diskuterats. Typ nummer 0x0 grupperar booleska värden, ett nullvärde och något som kallas fylla av plutil. pl. Jag vet inte vad fyllningen är för. Objektlängden är faktiskt objektets värde och bytelängden är alltid noll. Ett värde av 0 betyder null, 8 betyder False, 9 betyder True, och 15 betyder fill. Något annat värde är ogiltigt. Bytelängden är lika med 2 till effekten av objektlängden. Giltiga objektlängder är 0, 1, 2 och 3 för respektive 1, 2, 4 och 8 bitgrupper. Kodningen är som ett big-endianskt signerat heltal i lämpligt antal byte. Objektlängden till bytelängdskonvertering är densamma som för heltal. Objektlängden är 2 eller 3, motsvarande en bytelängd på 4 eller 8. Kodningen är som en big-endian, en-precision eller en dubbel-precisionsflotta, i enlighet därmed. Datum lagras som en flotta med ett värde av sekunder sedan epoken den 1 januari 2001, 0:00:00 GMT. Kodning är densamma som kodningen för flottörer, förutom att objektlängden alltid är 3, för en bytelängd på 8. Binär data Bytelängden är objektlängden och valfritt värde. Byterna tolkas inte. Enstaka byte-sträng Byte-längden är objektlängden, och valfritt värde är giltigt. Kodning är ASCII. Double Byte String Bytelängden är två gånger objektlängden, och valfritt värde är giltigt. Kodningen är utf-16 (big endian). Kodning är som heltal, förutom att värdena är osignerade. Dessa används i stor utsträckning i filer som skrivs med NSKeyedArchiver, en serializer för Objective-C-objekt. UID-värdet verkar vara indexet för ett värde inom objektlistan inuti en sådan plist. Bytelängden är objektlängden gånger antalet byte per objektreferens för denna plistfil, dvs antingen en eller två gånger objektlängden. Varje objektlängd är giltig. Kodningen är sammanlänkningen av objektreferensnumren som osignerade, big-endian-heltal som varje kodas i antalet byte per objektreferens för denna plistfil. Ordbok Bytelängden är två gånger objektlängden gånger antalet byte per objektreferens. Kodningen är som sammanfogning av två kodade arrayer, den första av nycklarna och den andra av värdena. Det första värdet i listan med nycklar motsvarar det första värdet i listan med värden, och så vidare. Slutliga anteckningar När du skriver en binär plistfil bör eventuella värden som upprepas i filen bara kodas en gång och det enda objektet refereras där någonsin det värdet upprepas. Andra länkarKonvertera binära plåtar Binära plister är de filer som Apple-produkter använder för att lagra information. Det enklaste sättet att visa dem är att konvertera dem till XML. Observera att binära data i XML-plist konverteras i base64 och därför är strängar i binärdata inte direkt synliga. Programplutil är inbyggd i Mac OS X (från och med 10.2), men det ingår också när iTunes är installerat på en Windows-dator. På Linux-libplist 1 tillhandahålls också en ekvivalent av plutil. plutil på en Windows-dator lagras i: Vilket kan läggas till PATH i miljövariabler så att plutil kan köras var som helst Om du vill kopiera plutilexekverbar till en annan katalog krävs det att ett antal DLL-filer fungerar. Dessa dlls är: ASL, CFNetwork, CoreFoundation, Foundation, icudt46, libdispatch, libicuin, libicuuc, libtidy, libxml2, objc, ptheadVC2, SQLite3 och zlib. Dessa finns alla i Apples programsupportmapp tillsammans med plutil. exe. För att konvertera binära plistor till XML kör kommandot: Eller med libplist Externa länkarPlistinator Plistinator är gjord för att redigera Plist-filer Om du redan vet exakt vad du behöver så är Plistinator redo att knyta Plists för dig. Plistinator är: Gjord för jobbet Lätt Viktigt Enkelt att använda Robust Kraftfulla Crunches Binär Ampere XML Plistfiler På Mac, Windows-amp Linux Ständigt Förbättrad Om du redan vet att du behöver ett Plist-redigeringsverktyg, gå bara direkt till vår Gumroad-butik och hämta Plistinator för din plattform just nu. Vi tror att Plist är ett bra format för strukturerad data för appar på alla plattformar. bättre åtminstone alternativen. Och när du har Plistinator blir det ett bra format. Behöver övertygas Läs på Plist är kort för egenskapslista: det är ett filformat för lagring av strukturerad data. Plistor är öppen källkod och har funnits i ungefär lika länge som Internet. Plåtar är kända för deras användning av Apple i gadgets som iPhone och på Mac. och det visar sig att de fungerar bra på andra plattformar också. Se nedan för de smutsiga detaljerna i Plist storage format. Plister är idealiska för att skicka data med dina appar, speciellt om den data ändå inte ändras mycket. Om data i din app är strukturerad - till exempel heierarkisk - så kan Plist vara ett bättre val för dataförlängning än en databas. Plister ska inte förväxlas med filen Java XML Property List - som kan lagra den djupa strukturen som en plist kan. Java-fastighetslistor har också ett binärt alternativ för effektiv lagring av stora datamängder. Stabil. Itaposs har funnits i åldrar. Födelseplatsen för Plistfilen var NeXT Computer i slutet av 80aposs, där den hade ett textbaserat format. De moderna plisterna i dag utvecklades av Apple för sitt första Mac OSX-operativsystem och har funnits sedan 2000 eller så, ungefär den tid som JSON kom på scenen. Plister finns i många Open Source-projekt, inklusive GnuSTEP och Darwin, och Appleaposs egna OpenSource-projekt. Effektiva plåtar är snabba att läsa och skriva, och snabbt att ställa in: vanligtvis är det bara en-liner. XML-formatet är mänskligt läsbart (mer eller mindre) och binärformatet är mycket rymd effektivt och snabbt att ladda. Strukturerade plåtar kan göra arrays av dikter av booleaner, siffror, dikt och arrays av. Nå får du idén. Eftersom dikter kan kartlägga till dina objekt Plister är ett bra sätt att initialisera objekt i din app. Open Since Plist är ett Open Source-format är plistor tillgängliga för alla plattformar så länge vi vill använda dem. Kolla plistatoraposs-kodresurssida för implementering av community-plaster i C, C, Java, Python och andra språk. Arenapost plistar bara XML Varför inte klippa mellanmedlemmen och skriv bara mina data i XML Strukturerade data här betyder Arrays Ordböcker Typad data (heltal, datum) XML är bara ett serialiseringsformat. Du behöver fortfarande implementera strukturen ovanpå den. Dessutom om dina verktyg kan hantera korrekt inramat XML betyder det inte att de kan hantera den strukturerade datantikanten ovanpå. Strukturerade dataformat är bara lika kraftfulla som de verktyg du behöver redigera dem: speciellt när du skapar en hel del av data som i ett större spel eller app. Plister är inte (bara) XML. Om du försöker använda en vanlig XML-editor för att skapa en Plist-fil, kan det vara en plistläsare som kan läsa den. Även om schemat är på något sätt måste det finnas balanserade nycklar och fält. Allt detta blir uppenbart om mer än en person arbetar på projektet. Om dina verktyg inte kan skapa faktiska strukturerade data (som en plistfil) kommer dina bidragsgivare att skicka in filer som är ogiltiga, även om de kanske är OK som XML. För att ta itu med detta måste du skriva en massa XML-parsingskod och valideringsrutiner. Eller du kan bara läsa en plist i dina föremål med ett par rader av kod. En annan anledning att välja Plist över rå XML är utrymme och prestanda - plist binär är liten och snabb. Medan du kan komprimera XML som bara gör det flakigt och långsamt att ladda jämfört med binära plistor. JSON är bra, speciellt för serialisering av data över webben. Det fungerar ganska bra för att lagra data i filer också, och det finns gott om JSON serialiserande bibliotek runt för att läsa och skriva det. Om du är mycket bekant med JSON och har använt den för config-filer så är det förmodligen ett bra val för att skicka data med din app. Det finns två saker som vi tycker gör Plist en vinnare över JSON för datadriven apps. För det första är det Plist har ett binärt format som är liten och snabb, andra Plistinator ser till att de datafiler du redigerar är giltigt inramade. De flesta verktyg som kan redigera JSON tillåter dig att placera något i taggarna och etiketterna, så att du kan skapa något som inte är giltigt som en datafil till din app. Syntaxmarkering och indragning kan hjälpa till att undvika JSON-kodningsfel, men det är fortfarande enkelt att göra korrupta JSON-filer - med icke-matchande fästen och så vidare. Denna typ av inramningsfel är särskilt lätt för mindre tekniska medlemmar i ditt lag som kanske säger att redigera nivåer i ditt spel eller arbetar med tillgångar. Med Plistinator kan du fortfarande stava en tagg felaktigt eller ange felaktiga data, men det garanteras åtminstone att det är en giltig Plist-fil. Din kod kan ladda den och visa ett programnivåfel istället för ett obskurligt JSON-analysfel. Om du är en JSON-veteran och redo att hantera det fruktade JSON-parse-undantaget i din kod, så överför det till dig. Men plister är ett bra val, och Plistinator är här för att göra dem till ett vänligt och kraftfullt val. För Plistinator hanterar vi Plist med följande typer: Array Dictionary Boolean (antingen sant eller falskt) Antal (kan vara verkligt eller heltal) Datumsträng (utf-8) Det finns några intressanta skillnader mellan binär och XML-format Binär har en UID-data typ som används på Mac för serialisering av vissa binära datatyper, huvudsakligen i preferensfiler. Binär har också en explicit null typ. Sällan sett i naturen. Binär kan göra en ASCII-strängtyp, såväl som UTF-8-strängen. I praktiken blir det bara ett annat sätt att binära kan lagra data på ett mer kompakt sätt. UID: Plistinator kan läsa dessa och representerar det genom att skapa en enkel element Dictionary med UID som ett antal barnelement. När du skapar strukturerad data för en app kan denna nyfikenhet ignoreras. Det finns aldrig anledning att vilja skapa en UID: men Plistinator stöder det på så sätt att du kan läsa Apple Mac binära filer om du vill. ASCII: När serialisering sker till binär undersöker Plistinator strängar och om de kan lagras som ASCII när binär begärs görs detta, för att spara utrymme och göra snabbare belastningar.
No comments:
Post a Comment