Objective-C is a big pain in the ass when it comes to serialize instances
of your custom classes inheriting from
NSObject. If you Google how to
you serialize your custom objects into JSON, you will get tens of results
NSCoding” protocol. Biggest take of this post will be:
You don’t need to implement
NSCoding. Here’s why:
First of all, take a look at Sam’s article on
how to implement
NSCoding protocol. First thing you see is, you have
to write encode/decode statements for every single member you have in your
custom class. As a Java/C#/Go/Python developer (or whatever) first thing you
think is this is too much boilerplate for a simple object model.
While digging more on this, I found a library probably nobody uses.
It has only a few stars on GitHub, but guess what, it does the trick. Check
KVCObjectSerializer on GitHub. I’m telling you how to use
it in two steps:
First, you need to derive your class from
KVCBaseObject instead of
NSString *jsonString = [customObj objectToJson]; // or: NSDictionary *dict = [customObj objectToDictionary];
Tada! That easy. It also handles serialization of
members (which already implement
NSCoding by default) in your custom class.
It also supports recursion on members of other custom classes.
A better solution?
Check out GitHub’s Mantle. It gives you more control e.g. you can change name mappings of members, provide custom serializers for each member. It also has JSON serialization capabilities and much more advanced in so many ways.
If you go with Mantle, you inherit your class from
MTLModel which does
NSCoding automatically so you can persist your objects into files
easily as well. It also has CocoaPods integration, which is cool.
Why use this?
NSCoding is prone to errors, there is a chance you can always
forget to add new fields in your custom class. This is also not practical at
all, on an average project you would have a few entity classes and you got to
NSCoding to save them on
NSUserDefaults or write to a file etc.
This library fits very well if you are going to consume REST API responses in your app. It gives you almost no control, but in turn it is plug-and-play.
When not to use this?
If you have no performance concerns (I can’t think of any) and if your custom
classes do not have complex-to-serialize members (e.g. buffers,
non-serializable stuff) you should go for