Gson user guide tuyên bố rằng chúng ta nên định nghĩa hàm tạo không có giá trị mặc định cho bất kỳ lớp nào để làm việc với Gson đúng cách. Thậm chí nhiều hơn, trong các javadoc trên G23 của InstanceCreator
lớp học nói rằng ngoại lệ sẽ được ném nếu chúng tôi cố gắng deserialize dụ của lớp thiếu constructor mặc định và chúng tôi nên sử dụng InstanceCreator
trong trường hợp như vậy. Tuy nhiên, tôi đã cố gắng để thử nghiệm sử dụng Gson với lớp thiếu constructor mặc định và cả hai serialization và deserialization làm việc mà không có bất kỳ rắc rối.Công cụ xây dựng mặc định là no-args có bắt buộc đối với Gson không?
Đây là đoạn mã cho deserializaiton. Một lớp học mà không cần phi args constructor:
public class Mushroom {
private String name;
private double diameter;
public Mushroom(String name, double diameter) {
this.name = name;
this.diameter = diameter;
}
//equals(), hashCode(), etc.
}
và một bài kiểm tra:
@Test
public void deserializeMushroom() {
assertEquals(
new Mushroom("Fly agaric", 4.0),
new Gson().fromJson(
"{name:\"Fly agaric\", diameter:4.0}", Mushroom.class));
}
mà hoạt động tốt.
Vì vậy, câu hỏi của tôi là: Tôi có thể thực sự sử dụng Gson mà không cần phải có hàm tạo mặc định hoặc có bất kỳ hoàn cảnh nào khi nó không hoạt động không?
Điều gì sẽ xảy ra nếu tôi có một hàm tạo mặc định để đặt thành viên cuối cùng của tôi thành null, nhưng không có setter cho thành viên này? Đó có phải là một giải pháp hợp lý không? –
@ thomas.mc.work Gson sẽ có thể thiết lập trường trực tiếp thông qua sự phản chiếu (và có khả năng một số công việc không an toàn) và bạn có thể lấy nó thông qua một getter (hoặc trực tiếp thông qua hiện trường. Tôi không khuyên bạn nên thiết kế này. –
I đã tìm thấy một giải pháp tốt cho vấn đề 'final' với jackson thư viện được mô tả ở đây: http://stackoverflow.com/a/11838468/2854723 –