2013-01-13 40 views
5

Chúng tôi sử dụng JSON serialization với Jackson để hiển thị trạng thái nội bộ của hệ thống để gỡ lỗi các thuộc tính.Làm thế nào để tuần tự hóa các trường tạm thời bằng cách sử dụng jackson?

Theo mặc định, jackson không tuần tự hóa các trường tạm thời - nhưng tôi cũng muốn tuần tự hóa chúng. Làm cách nào để có thể tuần tự hóa các trường này? Một trong những cách tôi biết là cung cấp một getters cho các lĩnh vực này - nhưng tôi không muốn làm điều đó, như tôi có một số phương pháp getX mà tôi không muốn được gọi (ví dụ, có một số getters thay đổi trạng thái đối tượng).

Tôi biết tôi có thể tạo chú thích nhưng tôi thực sự muốn tránh chú thích đó.

Vì vậy, câu hỏi của tôi là: Có cách nào để thiết lập jackson để tuần tự hóa tất cả trường đối tượng không? bao gồm những người thoáng qua.

+1

Nếu bạn muốn serialize lĩnh vực @ javax.persistence.Transient, xem [Gere của câu trả lời] (http://stackoverflow.com/a/29109806/606662): –

+0

Đồng ý với @Markus Pscheidt – dirai

Trả lời

6

Tôi không nghĩ Jackson hỗ trợ bất kỳ loại cấu hình nào để cho phép nó tuần tự hóa một trường tạm thời. Có một vấn đề mở thêm tính năng đó, nhưng nó cũ và chưa được giải quyết (như xa như tôi có thể nói): http://jira.codehaus.org/browse/JACKSON-623

Vì vậy, câu hỏi của tôi là: Có cách nào để thiết lập jackson serialize tất cả các trường đối tượng? bao gồm những người thoáng qua.

Vì vậy, để trả lời câu hỏi của bạn, không.

Một số công cụ Java JSON khác, chẳng hạn như GSON làm hỗ trợ tùy chọn cấu hình để tuần tự hóa các trường tạm thời. Nếu bạn có thể sử dụng công cụ khác, bạn có thể xem xét công cụ đó (đối với GSON, xem: https://sites.google.com/site/gson/gson-user-guide).

Để mở rộng một chút, bạn có thể thử một cách tiếp cận khác.

Trước tiên, bạn không nên cố gắng tuần tự hóa trường tạm thời. Sau khi tất cả các định nghĩa của thoáng qua là "không serialize này." Tuy nhiên, tôi có thể nghĩ đến một số tình huống cụ thể mà nó có thể cần thiết, hoặc ít nhất là thuận tiện (như khi làm việc với mã mà bạn không thể sửa đổi hoặc như vậy). Tuy nhiên, trong 99% trường hợp, câu trả lời là không làm điều đó. Thay đổi trường để nó không thoáng qua nếu bạn cần serialize nó. Nếu bạn có nhiều bối cảnh trong đó bạn sử dụng cùng một trường và bạn muốn nó được tuần tự hóa trong một trường (ví dụ: JSON) và không được tuần tự hóa theo thứ tự khác (ví dụ: java.io) thì bạn nên tạo một trình tự sắp xếp tùy chỉnh cho trường hợp bạn không muốn nó, thay vì lạm dụng từ khóa.

Thứ hai, khi sử dụng bộ thu thập và có "một số getters thay đổi trạng thái đối tượng", bạn cũng nên tránh điều đó. Điều đó có thể dẫn đến nhiều hậu quả ngoài ý muốn. Và, về mặt kỹ thuật, đó không phải là một getter, đó là một setter. Ý tôi là, nếu nó biến đổi trạng thái, bạn đã có một mutator (setter) thay vì accessor (getter), ngay cả khi bạn đặt tên nó theo quy ước "get" và trả về một số thứ.

0

Bạn có thể tạo trình thu thập tùy chỉnh cho trường thoáng qua đó và sử dụng thuộc tính @XmlElement. Nó không quan trọng tên của nó.

Ví dụ:

public class Person { 

    @XmlTransient private String lastname; 

    @XmlElement(name="lastname") 
    public String getAnyNameOfMethod(){ 
     return lastname; 
    } 

} 
10

Giải pháp của tôi với Jackson 2.4.3:

private static final ObjectMapper mapper = 
     new ObjectMapper(){{ 

      Hibernate4Module module = new Hibernate4Module(); 
      module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION); 
      registerModule(module); 

     }}; 
Các vấn đề liên quan