I would prefer a protocol in addition to our current runtime checking that objects implement YKJSONSerializable methods. Protocols are for "defining message contracts," as Apple puts it, and that's definitely what we're doing here, even though we can't compile time check that since most of our serializable objects will be wrapped in containers. Benefits:

- Protocol explicitness
- Nice protocol to look at when people get errors serializing objects that don't implement the protocol
- Compiler warning once you tag a class as implementing this protocol that they haven't implemented the methods yet
- All objects that are serializable are clearly marked

For NSDictionary and NSArray, you can add categories that implement this protocol (even though you can't tag a category that way). You can then register those classes with YKJSONSerializable at runtime if you want, or just continue doing the same respondsToSelector: checking that you're doing now.