`

对于含有泛型的Collection在使用Gson序列化时信息丢失的解决方案

    博客分类:
  • Java
 
阅读更多

这两天项目接近冒烟阶段,没时间作详细描述。将关键类列举如下:

序列化的Adapter:

/**
 * @author lanbo.xj
 * 
 */
public class CarTypeAdapter implements JsonSerializer<Car> {

	private static Gson gson = new Gson();

	@Override
	public JsonElement serialize(Car car, Type type,
			JsonSerializationContext context) {
		JsonObject jo = new JsonObject();
		jo.add(car.getClass().getName(), gson.toJsonTree(car, car.getClass()));
		return jo;
	}

}
 

反序列化的Adapter:

/**
 * @author lanbo.xj
 * 
 */
public class CarListTypeAdapter implements JsonDeserializer<List<Car>> {

	@Override
	public List<Car> deserialize(JsonElement je, Type type,
			JsonDeserializationContext context) throws JsonParseException {
		List<Car> cars = new ArrayList<Car>();
		JsonArray jsonArr = je.getAsJsonArray();
		for (Iterator<JsonElement> iter = jsonArr.iterator(); iter.hasNext();) {
			JsonObject jo = (JsonObject) iter.next();
			for (Entry<String, JsonElement> entry : jo.entrySet()) {
				String className = entry.getKey();
				try {
					@SuppressWarnings("rawtypes")
					Class clazz = null;
					clazz = Class.forName(className);
					System.out.println(clazz.getName());
					Car car = context.deserialize(entry.getValue(), clazz);
					cars.add(car);
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		}
		return cars;
	}
}

 测试类:

public class GsonTest {
	public static void main(String[] args) {
		JeepCar car1 = new JeepCar();
		car1.setPrice(1000);
		car1.setSpeed(200);
		MotorCar car2 = new MotorCar();
		car2.setPrice(2000);
		car2.setYear(1999);
		List<Car> cars = new ArrayList<Car>();
		cars.add(car1);
		cars.add(car2);
		GsonBuilder gb = new GsonBuilder().serializeNulls();
		Type baseType = new TypeToken<List<Car>>(){}.getType();
		gb.registerTypeAdapter(baseType, new CarListTypeAdapter());
		gb.registerTypeAdapter(JeepCar.class, new CarTypeAdapter());
		gb.registerTypeAdapter(MotorCar.class, new CarTypeAdapter());
		Gson gson = gb.create();
		
		String str = gson.toJson(cars);		
		System.out.println(str);

		List<Car> cars3 = gson.fromJson(str, baseType);
		System.out.println(((JeepCar)cars3.get(0)).getSpeed());
	}
}
 
分享到:
评论

相关推荐

    gson解析泛型和将泛型转为json字符串

    对于泛型数组,例如`T[]`,可以使用`TypeToken`来获取其类型信息,然后反序列化: ```java Type arrayType = new TypeToken[]&gt;(){}.getType(); T[] myArray = gson.fromJson(jsonString, arrayType); ``` 5. *...

    序列化工具(Gson, Jackson, FastJson, ProtoBuf)

    它的使用简单,支持复杂的类型转换,包括泛型、枚举、自定义序列化和反序列化策略。Gson的优势在于其灵活性和强大的类型处理能力,使得它在处理JSON数据时非常便捷。 2. Jackson(FasterXML Jackson): Jackson是...

    反射泛型序列化(.net版)PPT

    在.NET框架中,反射、泛型和序列化是三个核心概念,它们对于开发高效、灵活且可维护的应用程序至关重要。让我们深入探讨这三个概念及其在.NET编程中的应用。 **反射** 反射是.NET框架提供的一种强大机制,它允许在...

    fastJosn Gson Jackson 序列化和反序列化所需要的jarlib.rar

    在使用这些库时,确保添加了对应的jar依赖,如本压缩包中的lib文件,这样就可以在项目中直接调用相关API进行序列化和反序列化操作。记得在引入外部库时,避免版本冲突,确保与项目其他依赖兼容。此外,理解和掌握每...

    fastjson、gson、jackson序列化和反序列化所用 json

    Gson的主要功能是通过`Gson.toJson()`方法实现对象到JSON的序列化,以及`Gson.fromJson()`方法实现JSON到对象的反序列化。Gson还支持自定义类型转换器,可以满足定制化的需求。 3. **Jackson**:Jackson是由...

    使用gson解析json

    处理泛型类型时,可以使用`TypeToken`来帮助Gson识别真实类型: ```java List&lt;User&gt; userList = gson.fromJson(jsonArrayString, new TypeToken&lt;List&lt;User&gt;&gt;(){}.getType()); ``` 五、注意事项 1. 数据类型匹配:...

    Unity5Google Protobuf解析工具,支持android/ios泛型列表参数正反序列化

    本工具正是为了解决在Unity5环境中,使用Protobuf进行Android和iOS平台的泛型列表参数的正反序列化问题。 首先,我们需要理解什么是序列化和反序列化。序列化是将对象转换为可传输或存储的格式,而反序列化则是将...

    Gson基本使用方法

    如果希望在序列化或反序列化过程中忽略某些字段,可以使用`@Expose`注解,并设置`serialize`和`deserialize`属性。 8. **字段命名策略** 默认情况下,Gson会根据字段名进行映射。如果字段名与JSON键不一致,可以...

    Android 下用GSON示例

    4. **类型Token**:在反序列化泛型类型时,需要使用`TypeToken`来指定目标类型。 在"Android下用Gson示例"项目中的`GSONAndroidSample-master`可能包含了更具体的示例代码和使用场景,如保存和加载对象到...

    Gson简要使用笔记

    `TypeToken` 是 Gson 提供的一个泛型安全的类型引用,用于在运行时捕获和表示类型信息。 除了默认行为外,Gson 还支持通过注解(Annotations)进行更精细的控制。例如,你可以使用 `@Expose` 注解来指定哪些字段...

    Gson_User_Guide.pdf

    Gson能够处理泛型类型,但是需要注意的是泛型信息在运行时会被擦除,因此需要特别的处理才能正确地序列化和反序列化泛型对象。 10. 内置序列化器和反序列化器 Gson自带了一些标准类型和集合的序列化器和反序列化...

    Java中泛型的各种使用

    在Java编程语言中,泛型(Generic)是一个强大的特性,它允许我们在编译时检查类型安全,并且可以消除运行时的类型转换。泛型引入的主要目的是提高代码的可读性和可维护性,同时减少类型转换的冗余。下面将详细讨论...

    protostuff fastjson gson 高性能序列化jar包

    高效的序列化库对于处理大量数据或在网络间传输对象时至关重要。`protostuff`、`fastjson`和`gson`就是三个流行的Java序列化库,它们各自具有独特的特性和优势。 首先,让我们详细了解一下这三个库: 1. **...

    gson2.7相关jar包

    5. **泛型处理**:Gson在处理泛型类型时非常强大,2.7版本可能会进一步优化这方面的性能,确保泛型类型的序列化和反序列化更加准确无误。 6. **运行时类型信息**:在某些情况下,Gson可以利用运行时的类型信息来...

    com.google.gson.Gson 2.8.1 2.8.2 jar包 gson

    2. **注解支持**:Gson支持使用Java注解来定制序列化和反序列化的规则。例如,`@Expose`注解可以标记哪些字段需要被序列化或反序列化,`@SerializedName`可以重命名JSON字段名,以适应不同的API规范。 3. **复杂...

    Gson解析Json 泛型

    Gson解析json,实现泛型解析数据,根据用户传入的类型,解析称用户需要的,Common \CommonList 里面的status message data相关的约定可以更具开发者与服务器的约定修改

    Gson项目使用

    当你处理泛型类型时,Gson需要知道具体的类型信息。这时,你可以使用`TypeToken`。例如: ```java Type type = new TypeToken&lt;List&lt;User&gt;&gt;(){}.getType(); List&lt;User&gt; users = gson.fromJson(jsonString, type)...

    gson最新源码

    7. **TypeToken和Generics**: 当你需要序列化或反序列化泛型类型时,Gson需要知道确切的类型信息。这时,你可以使用`TypeToken`来捕获类型信息,因为它包含运行时的类型信息。 8. **注解支持**: Gson支持使用Java...

    Webservice传递泛型的案例,包括web服务端和mobile端

    在Web服务中,泛型的使用通常涉及到序列化和反序列化。当我们需要通过Web服务传递泛型对象时,这些对象必须被转换成可以通过网络传输的格式,如XML或JSON。在C#中,我们可以使用ASMX或WCF服务来实现这一点。对于ASMX...

    电影售票系统使用泛型集合

    使用XML和TreeView显示影院放映列表 使用泛型集合维护有继承关系的电影票对象 座位数可以在系统中指定 ...使用简单工厂模式创建不同类型的电影票 使用多态实现不同类型...使用序列化和反序列化实现销售情况的保存和读取

Global site tag (gtag.js) - Google Analytics