2012-03-12 24 views
6

Tôi sử dụng GSON serialize POJO - cả đối tượng trước và sau khi thay đổi.Sử dụng Gson để tuần tự hóa POJO

Thay đổi (gọi là A) được thiết lập bởi Struts2 có thể dễ dàng được tuần tự hóa thành Json.

Trong khi POJO trước khi thay đổi được lấy từ cơ sở dữ liệu thông qua iBatis (gọi nó là B) không thể được tuần tự hóa.

Thông báo lỗi cho biết: Quên đăng ký bộ điều hợp loại?

Tôi đã đọc API Gson. Nhưng tôi không nghĩ rằng đăng ký một loại adapter cho mỗi POJO là một ý tưởng tốt. Điều gì làm cho B không thể được serialized?

Tôi viết một bản sao() cho POJO của tôi, và đối tượng nhân bản từ B cũng có thể được thực hiện.

Điều này gây nhầm lẫn ... Có ai có thể trả lời tôi không?

trước khi thay đổi (clone 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"} 

Sau khi thay đổi (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

Vui lòng đăng hai chuỗi JSON cũng như đầu ra trong cả hai trường hợp. –

+0

Cả hai chuỗi JSON đều hợp lệ, thông báo lỗi nào bạn gặp phải và thư viện nào? –

+0

Chuỗi đầu tiên được tuần tự hóa từ B'clone. ** Không có lỗi trong quá trình đó. Lỗi chỉ xảy ra khi tôi cố gắng tuần tự hóa POJO B. ** Thông báo lỗi: _java.lang.UnsupportedOperationException: Đã cố gắng tuần tự hóa java.lang.Class: com.b5.customer.domain.Customer . Quên đăng ký bộ điều hợp loại? _ –

Trả lời

10

Nghe có vẻ như POJO của bạn là loại khách hàng? Khi bạn sao chép đối tượng của mình, bạn đang tạo một Khách hàng mới, và Gson có thể tuần tự hóa mà tốt. Tuy nhiên, khi bạn tìm nạp cùng một đối tượng đó từ DB, nó không phải là một đối tượng Customer chuẩn. Thay vào đó, nó là một lớp con bao gồm một số thông tin kiên trì, chẳng hạn như lớp của đối tượng.

Có lẽ giải pháp đơn giản nhất là sử dụng chú thích @Expose của Gson. Nếu bạn tạo đối tượng Gson của mình với new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(), thì bạn có thể đánh dấu từng trường Khách hàng mà bạn muốn tuần tự hóa với @Expose. Bất kỳ trường nào khác, bao gồm các trường của lớp con của khung persistence của bạn, sẽ không được tuần tự hóa.

+0

Câu trả lời hay! – Medo

2

Brandon đã đúng. Đây là một giải pháp khác nếu bạn không muốn sử dụng bất kỳ chú thích hoặc sửa đổi lớp POJO của bạn. Điều này có thể giúp cho bất kỳ kẻ nào khác.

Type typeOfSrc = new TypeToken<A>() {}.getType(); //this helps for generic one. 
gson.toJson(obj, typeOfSrc); or gson.toJson(obj, A.class); 
Các vấn đề liên quan