`

对于含有泛型的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-2.8.6.jar下载

    gson-2.8.6.jar下载,gson是Google开发的一款优秀的Java JSON解析库。它可以将Java对象转换成JSON字符串,也可以将JSON字符串转换成...8. 高性能:gson通过流式API、缓存策略以及基于类型的Maass抽象序列化类来提高性能。

    fastjson + gson + jsonlib + jacksonjar包

    Jackson的性能也非常高,同时支持注解,允许开发者通过注解自定义序列化和反序列化的行为。 这四个库各有优势,选择哪一个取决于具体的应用场景和需求。例如,如果需要高性能和简洁的API,Fastjson可能是最佳选择;...

    JSON jar包

    `gson-2.2.4.jar`是Gson的一个版本,它支持复杂的数据结构,包括泛型、自定义序列化和反序列化规则,以及日期和时间的处理。Gson的强大在于其灵活性和易用性,使得JSON与Java对象之间的转换变得非常简单。 3. **...

    json所需jar包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换...在使用这些库时,需要注意选择合适的版本,以确保与所用的Java环境和其他依赖库兼容。同时,理解并熟练运用其API,能够更好地进行JSON相关的开发工作。

    json必备jar包

    1. 支持自定义序列化和反序列化的逻辑。 2. 可以处理泛型类型和复杂嵌套的对象结构。 3. 提供了注解,允许开发者控制哪些字段参与转换。 4. 支持将JSON直接转换为Java对象,以及将Java对象写入JSON格式的输出流。 *...

    java中fastjson生成和解析json数据(序列化和反序列化数据)

    Fastjson是Java语言编写的高性能、完善的JSON库,可将Java对象与JSON格式的字符串进行相互转换,即序列化和反序列化。Fastjson采用独创算法,其解析速度在众多JSON库中表现卓越,甚至超过了被称为最快的Jackson库...

Global site tag (gtag.js) - Google Analytics