To exclude a field from class serialization I create a custom type adapter to write all fields except it, but the class has many fields.
Is there an easy way to achieve that?
Use transient on the field declaration.
private String serialized;
private transient String not_serialized;
cool, thanks.
Is there a way to make this exclusion happen at the runtime? E.g. something like Gson's ExclusionStrategy? The reason I'm asking is because I'd like to try using Moshi with Realm database. See Realm's instructions for Gson for example (they require using ExclusionStrategy to exclude some internal fields):
https://realm.io/docs/java/0.77.0/#other-libraries
Not at the moment. We could support say, @Json(include=false) or something.
Looks like it wouldn't solve it in this case. In the example on the above page User class inherits RealmObject class which would have some field to be excluded and this field is not accessible to library client and RealmObject itself is part of the library too, user has no option of annotating its fields with @Json(include=false)...
I think transient is probably easiest. Let's stick with that.
Your best bet is to write a JSON Adapter that converts a value to something that can be encoded. The wiki has examples.
Yes, transient looks really simple and means exactly same as its documentation says :)
Ok, thanks, will play around.
Would be nice if this transient feature could be mentioned in the README.
Good idea @vanniktech. Done!
Please take into account that making a field transient will turn into that field not being serialized; ex: Bundle.putSerializable(...) won't work on that specific field.
anyone looking for kotlin alternative,it would be @ Transient
@i-farhanp Unfortunately @ Transient requires a backing field, so you can't do:
@ Transient val something: String by lazy { ... }
What is the proper solution to ignore a field for Kotlin? Moshi throws an exception on a lazy property. So right now I simply can't use lazy properties on classes serialized by Moshi.
@swankjesse How to achieve it in Kotlin ?
@swankjesse it would be nice if you revisited this issue, because transient is clearly not suitable for all kotlin usages.
@grennis could you file a separate issue with a stacktrace or small sample project that reproduces it? Sounds like something we could at least give a better exception for.
@hzsweers and others, I found that you CAN use lazy properties on Moshi classes with: @delegate:Transient (instead of @Transient...) So, I think it's fine.
transient is also used by other libraries, such as Cupboard for the same purpose. With two separate annotations (one for Moshi, one for Cupboard), one could mark a field for inclusion/exclusion in JSON as well as (separately) in a database table.
But with the current approach of only supporting this via transient, Moshi makes it hard to play well with other libraries. Ideally, each library鈥檚 builder should provide a way to opt out of special treatment for transient and opt into annotation-based exclusion strategies.
@chimbori I agree. Transient has too many meanings in other contexts. Moshi should have its own dedicated annotation for excluding properties.
Most helpful comment
@chimbori I agree. Transient has too many meanings in other contexts. Moshi should have its own dedicated annotation for excluding properties.