Fixed Issue 54 to enable serialization of fields that are declared of type
Object.
This commit is contained in:
parent
f6a278018e
commit
5631132892
|
@ -124,6 +124,16 @@ final class JsonSerializationVisitor implements ObjectNavigator.Visitor {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Object fieldValue = getFieldValue(f, obj);
|
Object fieldValue = getFieldValue(f, obj);
|
||||||
|
// See if the fieldValue has better type information than the specified typeOfF
|
||||||
|
// This takes care of situations where the field was declared as an Object, but the
|
||||||
|
// actual value contains something more specific. See Issue 54.
|
||||||
|
if (fieldValue != null && typeOfF instanceof Class) {
|
||||||
|
Class<?> classOfF = (Class<?>) typeOfF;
|
||||||
|
Class<?> actualClassOfF = fieldValue.getClass();
|
||||||
|
if (classOfF.isAssignableFrom(actualClassOfF)) {
|
||||||
|
typeOfF = actualClassOfF;
|
||||||
|
}
|
||||||
|
}
|
||||||
addAsChildOfObject(f, typeOfF, fieldValue);
|
addAsChildOfObject(f, typeOfF, fieldValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -361,6 +361,21 @@ public class ObjectTest extends TestCase {
|
||||||
assertEquals(target.getExpectedJson(), gson.toJson(target));
|
assertEquals(target.getExpectedJson(), gson.toJson(target));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that a class field with type Object can be serialized properly.
|
||||||
|
* See issue 54
|
||||||
|
*/
|
||||||
|
public void testClassWithObjectFieldSerialization() {
|
||||||
|
ClassWithObjectField obj = new ClassWithObjectField();
|
||||||
|
obj.member = "abc";
|
||||||
|
String json = gson.toJson(obj);
|
||||||
|
assertTrue(json.contains("abc"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ClassWithObjectField {
|
||||||
|
Object member;
|
||||||
|
}
|
||||||
|
|
||||||
public void testInnerClassSerialization() {
|
public void testInnerClassSerialization() {
|
||||||
Parent p = new Parent();
|
Parent p = new Parent();
|
||||||
Parent.Child c = p.new Child();
|
Parent.Child c = p.new Child();
|
||||||
|
@ -371,7 +386,8 @@ public class ObjectTest extends TestCase {
|
||||||
|
|
||||||
public void testInnerClassDeserialization() {
|
public void testInnerClassDeserialization() {
|
||||||
final Parent p = new Parent();
|
final Parent p = new Parent();
|
||||||
Gson gson = new GsonBuilder().registerTypeAdapter(Parent.Child.class, new InstanceCreator<Parent.Child>() {
|
Gson gson = new GsonBuilder().registerTypeAdapter(
|
||||||
|
Parent.Child.class, new InstanceCreator<Parent.Child>() {
|
||||||
public Parent.Child createInstance(Type type) {
|
public Parent.Child createInstance(Type type) {
|
||||||
return p.new Child();
|
return p.new Child();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user