Hãy tưởng tượng tôi có POJO sau:(De-) Serialize Bean một cách tùy chỉnh trong thời gian chạy
class Pojo {
String s;
Object o;
Map<String, String> m;
}
Và khi chạy, tôi muốn mặc định serialization/deserialization cho tất cả các thuộc tính ngoại trừ một. Thông thường, tôi muốn thay thế một trường bằng ID của nó trong cơ sở dữ liệu khi tuần tự hóa, tương tự như this other question.
Ví dụ, tôi muốn thay thế o
bởi một chuỗi thu được từ một bản đồ bên ngoài (ví dụ: object1
< => "123" và object2
< => "456"):
- serialization: đọc
o
và thay thế (vì vậy nếuo
làobject1
, serialize như chuỗi "123") - deserialization: đọc "123", truy vấn một số bảng để có được giá trị ban đầu của
o
trở lại (tức làobject1
), tái tạo một objecPojo
t vớio = object1
.
Tôi hiểu rằng Mô-đun sẽ là một cách để làm điều đó nhưng tôi không chắc chắn cách sử dụng chúng trong khi vẫn giữ tự động BeanSerializer/Deserializer cho các thuộc tính không cần phải thay đổi.
Ai đó có thể đưa ra ví dụ (thậm chí là giả tạo) hoặc phương pháp thay thế không?
Ghi chú:
- tôi không thể sử dụng chú thích hoặc mixins như những thay đổi chưa được biết tại thời gian biên dịch (ví dụ: bất kỳ thuộc tính có thể được thay đổi theo một cách mà không phải là thể xác định được).
- This other question điểm để sử dụng CustomSerializerFactory, dường như thực hiện công việc. Thật không may, trang web chính thức chỉ ra rằng it is not the recommended approach any more và mô-đun nên được sử dụng thay thế.
Sửa
Để được rõ ràng hơn một chút, tôi có thể làm như sau với mixins ví dụ:
ObjectMapper mapper = new ObjectMapper(MongoBsonFactory.createFactory());
mapper.addMixInAnnotations(Pojo.class, PojoMixIn.class);
ObjectReader reader = mapper.reader(Pojo.class);
DBEncoder dbEncoder = DefaultDBEncoder.FACTORY.create();
OutputBuffer buffer = new BasicOutputBuffer();
dbEncoder.writeObject(buffer, o);
với Mixin sau:
abstract class PojoMixIn {
@JsonIgnore Object o;
}
Và sau đó thêm chuỗi bắt buộc đối với nội dung JSON. Nhưng tôi sẽ cần phải biết tại thời gian biên dịch rằng nó là lĩnh vực o
mà cần phải được thay thế, mà tôi không.
> Tôi không thể sử dụng chú thích hoặc mixins như những thay đổi chưa được biết tại thời gian biên dịch (tức là bất kỳ thuộc tính có thể được> thay đổi theo một cách không thể xác định được). Bạn có thể làm rõ, xin vui lòng? Rất bối rối, bởi vì tất cả mọi thứ ở trên "Ghi chú:" tiêu đề là tĩnh và được biết đến tại thời gian biên dịch. Các lớp học (Pojo) và các trường của Pojo chưa được biết trước? –
Bạn có cho rằng không an toàn khi giả định bất kỳ cấu trúc lớp học nào? Raw deserialises raw (untyped/simple) ràng buộc dữ liệu đối tượng đối tượng cấu trúc JSON như LinkedHashMap, và mảng cấu trúc JSON như ArrayList
@GlenBest Có thể lớp Pojo có thể nhiều hơn hoặc ít hơn. Tôi đã đưa ra một ví dụ trong đó 'o' được thay thế bằng một String. Nhưng sau đó trong chương trình, nó có thể là 'm' mà cần phải được thay thế bởi một số String và' o' serialized "bình thường". – assylias