Don’t forget about JsonIgnore ;). I’ve never been a big fan of the ignored property paired with the “only for serialization” property. It muddies up the model and adds unneeded complexity. Not to mention it’s a leaky abstraction.
The wrapper approach feels a lot like the decorator pattern. This can work okay if you’ve only got a handful of classes to wrap, but it can get pretty tiresome if you’re wrapping lots of classes, especially if most of the properties are already serializable.
For example, let’s say you had a class with 20 properties and one of those is a Texture2D. You write a wrapper class and you have to re-implement all 20 properties doing something special for just one of them. Okay, fine. Then later, you have another class you need to serialize, it also happens to have a Texture2D property. Ugh, so you have to write another wrapper for this one for the same reason.
With the JsonConverter approach, you only have to write the converter once. Done. Works for all classes that have Texture2D properties so long as you remember to pass it into the serializer. Alternately, you can apply the converter as an attribute on the properties, or setup a converter contract resolver. Lots of options.
What about JSON.NET’s SelectToken? I can see how this might be useful at times. Personally I’ve been never it though.
In my experience, JSON.NET is an incredibly well thought out library. The documentation is excellent and with a little reading you’ll probably find a pretty good solution to most problems.