On 27 Feb 2013, at 01:00, Gwynne Raskind <gwy...@darkrainfall.org> wrote:

> On Feb 26, 2013, at 12:47 PM, Gerriet M. Denkmann <gerr...@mdenkmann.de> 
> wrote:
>> My investigations regarding archiving on OS X:
>> 
>> 1. NSArchiver stores all strings in Utf-8.
>>      This is inefficient for strings which contain mainly non-european 
>> characters (e.g. Chinese or Thai) as one character will use 3 bytes (Utf-16 
>> would use only 2).
>>      Corollary: It cannot store strings which contain illegal Unicode chars.
> 
> And then in UTF-16, strings which contain mostly ASCII/European characters 
> are wasting 2x space. Six of one, half dozen of the other. This is a very old 
> debate and I'm grateful that Apple chose UTF-8 for storage, as UTF-16 makes 
> things much more complicated.

Or one could (as NSKeyedArchiver seems to do) choose the shortest 
representation,


>> 2. NSKeyedArchiver seems to be ok.
>>      But it does create unnecessary data. E.g. in the case of an array 
>> containing identical objects, like:
>>      NSArray *a = @[ @"a", @"a", ...., @"a"];
>>      With 1 000 000 items it creates 10,000,395 bytes - my version creates 
>> only 1 000 332 bytes 
>>      and the output is still readable by NSKeyedUnarchiver.
> 
> Are you sure this is happening? NSKeyedArchiver is documented as doing 
> deduplication of objects. If this is true, it's definitely a bug and there is 
> no reason Apple wouldn't want it fixed.

Just try it yourself:
                #define NBR 1000000
                NSMutableArray *m = [ NSMutableArray array ];
                for ( NSUInteger i = 0; i < NBR; i++ ) [ m addObject: @"a" ];
                NSData *dataKeyed = [ NSKeyedArchiver 
archivedDataWithRootObject: m ];
                NSLog(@"%s NSKeyedArchiver created %10lu bytes ", __FUNCTION__, 
[dataKeyed length]);
Then change NBR to 1000001 and compare.

> 
>> 3, NSKeyedUnarchiver has several bugs.
>>      The string $null is converted to nil. 
>>      Very harmful if this string is part of a collection (like array, set or 
>> dictionary).
> 
> It should have already been mangled by NSKeyedArchiver.

Strings (other than keys) do NOT get mangled by NSKeyedArchiver. 

> 
>>      If the key in: encodeXXX:forKey: starts with an "$" NSKeyedArchiver 
>> correctly mangles this by prefixing
>>      another "$". But NSKeyedUnarchiver does not find these mangled keys and 
>> returns nil or 0.
> 
> You can, as a workaround, consider keys prefixed by $ as reserved, however 
> this is certainly a bug. The fact that no one has reported it/gotten it fixed 
> in so much time shows that it's probably not a major issue, though.
> 
>> I have not reported these bugs, as I am convinced that Apple has no interest 
>> in fixing these problems.
> 
> This is the exact attitude that causes Apple to be perceived as not having 
> interest. Please file the bugs - the engineers reading this list can't give 
> high priority to things that developers don't report, as much as they'd 
> probably like to.

I have filed the $null bug. Got back as duplicate with a very low id-number. 
Meaning: this bug is known to Apple since several years. Still no fix.

Gerriet.


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to