Skip to content

Instantly share code, notes, and snippets.

@thenixan
Created January 30, 2018 12:50
Show Gist options
  • Save thenixan/b0ce1d2fcd7776e7f0a802df82aa899f to your computer and use it in GitHub Desktop.
Save thenixan/b0ce1d2fcd7776e7f0a802df82aa899f to your computer and use it in GitHub Desktop.
data class NewDataHolder(
@JsonAdapter(ObservableTypeAdapterFactory::class)
@SerializedName("data")
val data: Observable<DataItem>
)
class ObservableTypeAdapterFactory : TypeAdapterFactory {
override fun <T> create(gson: Gson, type: TypeToken<T>): TypeAdapter<T>? {
return if (Observable::class.java.isAssignableFrom(type.rawType)) {
ObservableTypeAdapter<T>(type.type.getObservableParameterType(), gson) as TypeAdapter<T>
} else null
}
}
class ObservableTypeAdapter<T>(private val elementType: Type, private val gson: Gson) : TypeAdapter<Observable<T>>() {
@Throws(IOException::class)
override fun write(out: JsonWriter, observable: Observable<T>) {
out.beginArray()
observable.blockingForEach { gson.toJson(it, elementType, out) }
out.endArray()
}
override fun read(reader: JsonReader): Observable<T> {
return JsonReaderObservable(elementType, gson, reader)
}
}
private fun Type.getObservableParameterType(): Type = getTParameterType(Observable::class.java)
private fun Type.getTParameterType(expectedParameterizedType: Type): Type {
if (expectedParameterizedType == this) {
return expectedParameterizedType
}
if (this is ParameterizedType) {
if (expectedParameterizedType == rawType) {
val actualTypeArguments = actualTypeArguments
if (actualTypeArguments.size == 1) {
return actualTypeArguments[0]
}
}
}
throw IllegalArgumentException(toString())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment