Как сериализовать ЛЮБОЙ объект в URI?
Мой основной вопрос: есть ли что-нибудь построенное, что уже делает это автоматически (не обязательно должно быть частью популярной библиотеки / пакета)? Основными вещами, с которыми я работаю, являются Spring (MVC) и Jackson2.
Я понимаю, что есть несколько ручных способов сделать это:
Создайте метод в каждом классе, который сериализует его конкретные свойства вproperty=value&
форма (вроде воняет, потому что это куча логического дублирования, я чувствую).Создайте функцию, которая принимает объект и использует отражение для динамического чтения всех свойств (я думаю, получателей), и строите строку, получая каждое из них. Я предполагаю, что именно так Джексон работает для сериализации / десериализации в целом, но я действительно не знаю.Используйте некоторую особенность Джексона для индивидуальной сериализации объекта. Я исследовал пользовательские сериализаторы, но кажется, что они специфичны для класса (поэтому мне придется создавать по одному для каждого класса, который я пытаюсь сериализовать), в то время как я надеялся на общий способ. У меня просто проблемы с пониманием того, как применять один универсально к объектам. Несколько ссылок:http://techtraits.com/Programming/2011/11/20/using-custom-serializers-with-jackson/http://wiki.fasterxml.com/JacksonHowToCustomSerializersиспользованиеObjectMapper.convertValue(object, HashMap.class);
перебратьHashMap
пары ключ / значение и построить строку (котораячто я использую сейчас, но я чувствую, что преобразования являются чрезмерными?).Я предполагаю, что есть другие, о которых я не думаю.Основной пост, который я посмотрел,Java: получение свойств класса для построения строкового представления
Моя точка зрения заключается в том, что у меня есть несколько классов, которые я хочу иметь возможность сериализовать, не указывая что-то конкретное для каждого. Вот почему я думаю, что функция, использующая отражение (# 2 выше), является единственным способом справиться с этим (если мне нужно сделать это вручную).
Если это поможет, пример того, что я имею в виду, скажем, с этими двумя классами:
public class C1 {
private String C1prop1;
private String C1prop2;
private String C1prop3;
// Getters and setters for the 3 properties
}
public class C2 {
private String C2prop1;
private String C2prop2;
private String C2prop3;
// Getters and setters for the 3 properties
}
(нет, имена свойств и соглашения - это не то, что использует мое реальное приложение, это просто пример)
Результаты сериализации будутC1prop1=value&C1prop2=value&C1prop3=value
а такжеC2prop1=value&C2prop2=value&C2prop3=value
, но есть только одно место, которое определяет, как происходит сериализация (уже определенная где-то или созданная мной вручную).
Так что моя идея заключается в том, что мне придется использовать следующую форму (взято из поста, на который я ссылался выше):
public String toString() {
StringBuilder sb = new StringBuilder();
try {
Class c = Class.forName(this.getClass().getName());
Method m[] = c.getDeclaredMethods();
Object oo;
for (int i = 0; i < m.length; i++)
if (m[i].getName().startsWith("get")) {
oo = m[i].invoke(this, null);
sb.append(m[i].getName().substring(3) + ":"
+ String.valueOf(oo) + "\n");
}
} catch (Throwable e) {
System.err.println(e);
}
return sb.toString();
}
И измените его, чтобы принять объект, и измените формат элементов, добавляемых кStringBuilder
, Это работает для меня, мне не нужна помощь, чтобы изменить это сейчас.
Итак, еще раз, мой главный вопрос: есть ли что-то, что уже обрабатывает эту (потенциально простую) сериализацию вместо того, чтобы мне пришлось (быстро) изменять вышеописанную функцию, даже если мне нужно указать, как обращаться с каждым свойством и значением и как комбинировать каждый?
Если это помогает, фоном этого является то, что я используюRestTemplate
(Spring), чтобы сделать запрос GET на другой сервер, и я хочу передать свойства / значения конкретного объекта в URL. Я понимаю, что могу использовать что-то вроде:
restTemplate.getForObject("URL?C1prop1={C1Prop1}&...", String.class, C1Object);
Я считаю, что свойства будут автоматически сопоставлены. Но, как я уже сказал, я не хочу создавать разные шаблоны и методы URL для каждого типа объектов. Я надеюсь получить что-то вроде следующего:
public String getRequest(String url, Object obj) {
String serializedUri = SERIALIZE_URI(obj);
String response = restTemplate.getForObject("URL?" + serializedUri, String.class);
return response;
}
гдеSERIALIZE_URI
вот где я бы с этим справился. И я мог бы назвать это какgetRequest("whatever", C1Object);
а такжеgetRequest("whateverElse", C2Object);
.