`
strong_fee
  • 浏览: 178817 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

DirectJNgine——关于泛型的Json序列化

阅读更多

问题描述:在采用DirectJNgine来完成前端ExtJS4和Java后台数据交互过程中,出现以下问题:前端通过ExtJS框架的DirectStore从后台请求数据,由于Store请求数据的格式基本不变,大概由以下字段构成:请求是成功的标志,记录总条数,返回到前端的数据(通常是一个集合)。对于这个集合,首先想到是泛型,泛化的类型为返回到前端的Model。所以,DirectMethod通常是以下形式:

 

/**
  * 用户列表.   */
 @DirectMethod
 public DataStore<User> list(int start, int limit, String sort, String dir) {
  List<User> users = new Vector<Users>();  //添加一些user
  return new DataStore<User>(this.users.size(), users, true);
 }

 

DataStore为:

 

public class DataStore<T> {
	/**
	 * 包含数据集合的属性名, 默认为空.
	 * <p>
	 * 约定前端data.Reader的包含数据集合的属性名(root属性)为data.
	 * </p>
	 */
	private List<T> data;

	/**
	 * 记录总条数.
	 * <p>
	 * 前端data.Reader的记录总条数totalProperty的属性名称默认为total.
	 * </p>
	 */
	private int total;

	/**
	 * 指示请求是否成功.
	 * <p>
	 * 默认为成功.
	 * </p>
	 */
	private boolean success = true;               
	// 构造方法,以及getters和setters...
}

 

 我觉得这是一个看上去比较完美的的模型。但是在使用的过程中,后端会抛以下异常:

 

 

java.lang.UnsupportedOperationException: Expecting parameterized type
Are you missing the use of TypeToken idiom?
See http://sites.google.com/site/gson/gs...ializing-Gener
at com.google.gson.TypeInfoFactory.getActualType(TypeInfoFactory.java:97)

 

原因是Gson不能正确解析DataStore<User>。经过做一些实验,验证如果返回的是泛型,而且类内部有使用泛型实例,则Gson解析通不过。实验请参看帖子Ext Direct Java based implementation #395 .

 

分析:通过Gson是可以解析泛型的,方法是把泛型的实际类型传给fromJson方法,如:

 

 

DataStore<User> usersStore = new DataStore<User>();
// 添加 users 到usersStore
Type listType = new TypeToken<DataStore<User>() {}.getType();
gson.toJson(myStrings, listType); 

 

但是DJN当前还没有完美得解决这个问题,作者的建议是尽量不要采用泛型作为返回值。DJN作者的解释的见Ext Direct Java based implementation #396 。由于DJN处理Json的宗旨”尽量避免Json序列化的工作”的限制,很多功能还不能完美的解决,比如说循环引用,属性排除等,这在一定程度上消弱了Gson本身的功能。关于这方面的问题,我还会继续和作者沟通,看看在将来的版本能否有一个好的解决方案。最新动态请关注上面的帖子和DJN的官网

 

解决方案:我最终将DataStore类设计为以下形式:

 

 

/**
 * 返回到前端的数据仓库.
 * <p>
 * 用户返回给前端Store的请求.
 * <p>
 * 
 * @author feiq
 * 
 */
public class DataStore {
	public DataStore() {

	}

	@SuppressWarnings("rawtypes")
	public DataStore(int total, List data) {
		this.total = total;
		this.data = data;
	}

	@SuppressWarnings("rawtypes")
	/**
	 * 包含数据集合的属性名, 默认为空.
	 * <p>
	 * 约定前端data.Reader的包含数据集合的属性名(root属性)为data.
	 * </p>
	 */
	private List data;

	@SuppressWarnings("rawtypes")
	public DataStore(int total, List data, boolean success) {
		this.total = total;
		this.success = success;
		this.data = data;
	}

	/**
	 * 记录总条数.
	 * <p>
	 * 前端data.Reader的记录总条数totalProperty的属性名称默认为total.
	 * </p>
	 */
	private int total;

	/**
	 * 指示请求是否成功.
	 * <p>
	 * 默认为成功.
	 * </p>
	 */
	private boolean success = true;

	// getters and setters...
}

 

这样既可以避免泛型序列化的问题,也可以避免继承泛型类的大量子类,如

 

class UsersStore extends DataStore<User>{
     // ...
}

 

 

 

分享到:
评论

相关推荐

    ASPNET中JSON的序列化和反序列化的方法

    通过这个类,我们可以创建一个序列化辅助类,如示例中的`JsonHelper`,它包含两个泛型方法:`JsonSerializer`用于序列化,`JsonDeserialize`用于反序列化。 为了使用`DataContractJsonSerializer`类,你需要引入...

    C# 工具类 泛型转JSON(Newtonsoft.Json)

    C# 工具类 泛型转JSON 使用 Newtonsoft.Json 转换JSON

    delphi_BaseObject_json序列化反序列化1

    本主题聚焦于在Delphi中实现JSON序列化和反序列化的技术,特别是针对"BaseObject"类的实例。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁性和易读性而被广泛应用。 首先,我们需要了解...

    又小又快又无依赖Json序列化与反序列化

    又小又快又无依赖Json序列化与反序列化 eg: 1.json序列化 String json=JsonUtil.instance().obj2Json(obj); 2.json反序列化(Object表示具体的类) Object obj=JsonUtil.instance().json2Obj(json,Object.class) ...

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

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

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

    当我们需要从JSON字符串反序列化到泛型类型时,可以创建一个泛型类型的`Gson`对象或使用`fromJson()`方法。例如,如果你有一个泛型列表`List&lt;T&gt;`,你可以这样做: ```java Type listType = new TypeToken...

    Jackson进行json序列化

    Jackson是Java领域中广泛使用的JSON处理库,它提供了高效的序列化和反序列化功能,能够将Java对象转换为JSON格式的字符串,同时也能将JSON数据转换回Java对象。在这个小例子中,我们将深入探讨如何使用Jackson进行...

    net基础——泛型PPT教案学习.pptx

    net基础——泛型PPT教案学习.pptx

    JSON的序列化和反序列化

    在上述代码中,`JsonSerializer&lt;T&gt;`方法接收一个泛型参数`T`,将其序列化为JSON字符串。`JsonDeserialize&lt;T&gt;`方法则接收一个JSON字符串,返回反序列化后的`T`类型对象。 处理特定类型如日期时间、集合和字典时,...

    json字符串转化为list泛型

    在Java编程中,我们经常需要将JSON格式的数据转换为Java对象,这通常涉及到将JSON字符串转化为List泛型。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和...

    博客《夯实JAVA基本之一——泛型详解(1)》对应源码

    在《夯实JAVA基本之一——泛型详解(1)》的博客中,作者深入浅出地探讨了泛型的基本概念和用法,本文将基于这个博客源码,详细解析泛型的相关知识点。 首先,泛型的主要目标是提高代码的类型安全性。在未引入泛型...

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

    本资源是一个针对Unity5的JSON解析工具,特别强调对Android和iOS平台的支持,以及泛型列表参数的正反序列化功能。 在Unity5中,内置的`JsonUtility`类是Unity提供的基础JSON解析和序列化工具。这个工具允许开发者将...

    博客《夯实JAVA基本之一——泛型详解(2)》对应源码

    另外,关于泛型和继承的关系,博客可能讲解了如何在子类中处理父类的泛型方法。有时,子类可能需要覆盖或实现带泛型的方法,这时需要遵循类型兼容性规则,确保子类的方法能接受父类方法的所有合法参数类型。 最后,...

    C# JSON 泛型解析

    多层嵌套的JSON字符串也可以解析,泛型T的属性要和JSON字符串反序列化的对象属性一致。

    C 设计新思维——泛型编程与设计范式之应用 PDF.rar

    C 设计新思维——泛型编程与设计范式之应用 PDF,候捷译序。㆒般人对C templates 的粗略印象,大约停留在「容器(containers)」的制作上。稍有研究由会发现,templates衍生出来的C Generic Programming(泛型编程)技术...

    编写高质量代码改善C#程序——使用泛型集合代替非泛型集合(建议20)

    建议20:使用泛型集合代替非泛型集合 在建议1中我们知道,如果要让代码高效运行,应该尽量避免装箱和拆箱,以及尽量减少转型。很遗憾,在微软提供给我们的第一代集合类型中没有做到这一点,下面我们看ArrayList这个...

    C/C++结构体序列化配置模板化

    另外,考虑到配置文件可能需要保存在特定格式(如XML、JSON或YAML)中,可以设计一个接口,让不同格式的序列化器继承自该接口,然后通过模板参数选择合适的实现。这样可以轻松地在不同格式之间切换,而无需大量修改...

    使用泛型的XML序列化

    以下是一些关于“使用泛型的XML序列化”的关键知识点: 1. **System.Xml.Serialization**: .NET Framework 提供了一个名为 `System.Xml.Serialization` 的命名空间,其中包含用于XML序列化和反序列化的类和接口。`...

    C#重要知识之——泛型列表List例子

    1. 初始化:`List&lt;T&gt;`可以通过初始化器创建,如`List&lt;int&gt; numbers = new List()`,或者指定初始容量,如`List&lt;int&gt; numbers = new List(10)`。 2. 添加元素:使用`Add(T item)`方法向列表末尾添加元素,例如`...

Global site tag (gtag.js) - Google Analytics