2012-03-12 72 views
6

我使用GSON序列化POJO - 两个对象在修改之前和之后。使用Gson来序列化一个POJO

由Struts2设置的修改过的(称为A)可以轻松地序列化为Json。

虽然更改前的POJO是通过iBatis(称为B)从数据库获取的,但无法序列化。

错误消息说:忘了注册一个类型适配器?

我已阅读Gson API。但我不认为为每个POJO注册一个类型适配器是一个好主意。什么使得B无法被序列化?

我为我的POJO编写一个clone(),并且从B克隆的对象也可以完成。

这令人困惑...有没有人可以回答我?

改变之前(B的克隆):

{"id":"6429B5329C544711A9848AF243D10E4E","idType":"未选择","firstDate":"Feb 29, 2012 12:00:00 AM","name":"testetes","gender":"男","phone":"553223","city":"未选择","ocup":"未选择","nation":"未选择","famStru":"未选择","infSouc":"未选择","creater":"EE4783A6272A4B62A5CC68DB3C11FE1E","createDate":"Feb 29, 2012 12:00:00 AM","purpose":"未选择","education":"未选择","income":"未选择","cars":"未选择","acptCarpRent":"未选择","acptCarpPrice":"未选择","handStand":"未选择","intentHouse":"未选择","intentArea":"未选择","intentLayout":"未选择","nextDate":"Mar 7, 2012 12:00:00 AM","wuyeType":"未选择","attentionPro":"958B9E093A84415B901900C2DA25C712","ordinaryTraffic":"未选择","attentionPoint":"未选择","buyDate":"未选择","cityArea":"未选择","lastUpdate":"Feb 29, 2012 12:00:00 AM","lastModifier":"EE4783A6272A4B62A5CC68DB3C11FE1E","saler":"A4FB4877DC2945E980477544A955B57F","state":"意向","status":"0"} 

改变(A)后:

{"id":"6429B5329C544711A9848AF243D10E4E","idType":"未选择","firstDate":"Feb 29, 2012 12:00:00 AM","visitMode":"","name":"testetes","gender":"男","telPhone":"","phone":"553223","fax":"","adrs":"","postCode":"","email":"","workUnit":"","city":"未选择","media_id":"","ocup":"未选择","idNum":"","nation":"未选择","famStru":"未选择","infSouc":"未选择","createDate":"Feb 29, 2012 12:00:00 AM","idAdr":"","purpose":"未选择","education":"未选择","income":"未选择","cars":"未选择","acptCarpRent":"未选择","acptCarpPrice":"未选择","handStand":"未选择","intentHouse":"未选择","intentArea":"未选择","intentLayout":"未选择","customerDetail":"","wuyeType":"未选择","attentionPro":"958B9E093A84415B901900C2DA25C712","ordinaryTraffic":"未选择","attentionPoint":"未选择","buyDate":"未选择","cityArea":"未选择","lastUpdate":"Mar 11, 2012 2:58:04 PM","lastModifier":"00000000000000000000000000000000","saler":"A4FB4877DC2945E980477544A955B57F","state":"意向"} 
+0

请发布两个JSON字符串以及两种情况下的输出。 – 2012-03-12 02:02:47

+0

这两个JSON字符串都是有效的,您遇到的错误消息以及从哪个库? – 2012-03-12 05:34:42

+0

第一个字符串是从B'clone序列化的。 **在这期间没有错误。只有当我尝试序列化POJO B时才会出现错误。**错误消息:_java.lang.UnsupportedOperationException:试图序列化java.lang.Class:com.b5.customer.domain.Customer 。忘记注册一个类型适配器?_ – 2012-03-12 06:33:06

回答

10

这听起来像你的POJO是Customer类型的?当你克隆你的对象时,你正在创建一个新的Customer,而Gson可以很好地序列化。但是,当您从数据库中获取相同的对象时,它不是标准的Customer对象。相反,它是一个包含一些持久性信息的子类,例如对象的类。

可能最简单的解决方案是使用Gson的@Expose注释。如果您使用new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()创建您的Gson对象,那么您可以用@Expose标记每个您想要序列化的客户字段。任何其他字段,包括持久性框架的子类,都不会被序列化。

+0

优秀的答案! – Medo 2015-01-28 13:17:38

2

布兰登是对的。如果你不想使用任何注释或修改你的POJO类,这是另一种解决方案。这对任何其他人都有帮助。

Type typeOfSrc = new TypeToken<A>() {}.getType(); //this helps for generic one. 
gson.toJson(obj, typeOfSrc); or gson.toJson(obj, A.class);