Digamos que tengo clase simple:
public class TestClass
{
public String field1 = "Field1";
public String field2 = "Field2";
public String field3 = "Field3";
}
Tengo varias clases POJO en mi proyecto y quiero ser capaz de serializar cada objeto a JSON. Así que creé nueva Serializer
clase (GSON utiliza para serializar):
public class Serializer
{
public String toJson()
{
return new Gson().toJson(this);
}
}
Y mi clase de ejemplo se extiende Serializer
:
public class TestClass extends Serializer
{
public String field1 = "Field1";
public String field2 = "Field2";
public String field3 = "Field3";
}
Y yo soy capaz de serializar cualquier objeto de la clase que se extiende Serializer
llamando al toJson
método, como esto:
TestClass test1 = new TestClass();
String json = test1.toJson();
Ahora quiero objeto de clase de construcción llamando al método estático fromJson
. Así que mis TestClass
es similar al siguiente:
public class TestClass extends Serializer
{
public String field1 = "Field1";
public String field2 = "Field2";
public String field3 = "Field3";
public static TestClass fromJson(String json)
{
return new Gson().fromJson(json, new TypeToken<TestClass>() {}.getType());
}
}
Por lo tanto, puedo crear nuevo objeto llamando a:
TestClass test2 = TestClass.fromJson(json);
Por supuesto, esto no es buen enfoque, porque necesito para incluir fromJson
la aplicación de mis todas las clases.
Pregunta: ¿cómo mover fromJson
a superclase ( Serializer
), y proporcionar única, escriba dependiente de la implementación de fromJson
método?
Se puede definir estática fromJson()
método en Serializer
la clase base:
public static class Serializer {
public static <T> T fromJson(String json, Type type) {
return new Gson().fromJson(json, type);
}
}
Y utilizarlo como:
TestClass obj = TestClass.fromJson(json, TestClass.class);
No es perfecto, con información de tipo redundante y no soporta bien los genéricos. Uno debe favorecer la composición sobre la herencia y en este caso mantener la serialización de la jerarquía de clases. Este enfoque no tiene ninguna ventaja sobre simplemente:
TestClass obj = new Gson().fromJson(json, TestClass.class);