Jak serializować DOWOLNY obiekt w URI?

Moje podstawowe pytanie: czy jest coś zbudowanego, co robi to automatycznie (nie musi być częścią popularnej biblioteki / pakietu)? Główne rzeczy, z którymi pracuję, to Spring (MVC) i Jackson2.

Rozumiem, że istnieje kilka ręcznych sposobów, aby to zrobić:

Utwórz metodę w każdej klasie, która serializuje jej specyficzne właściwościproperty=value& forma (rodzaj smród, ponieważ czuję, że to garść duplikacji logiki).Utwórz funkcję, która akceptuje obiekt i używa refleksji do dynamicznego odczytywania wszystkich właściwości (zgaduję gettery) i budowania ciągu, pobierając każdy z nich. Zakładam, że właśnie tak Jackson pracuje w serializacji / deserializacji, ale naprawdę nie wiem.Użyj funkcji Jacksona, aby niestandardowo serializować obiekt. Przeszukałem niestandardowe serializatory, ale wygląda na to, że są one specyficzne dla klasy (więc musiałbym utworzyć jedną dla każdej klasy, którą próbuję serializować), podczas gdy miałem nadzieję na ogólny sposób. Po prostu mam problem ze zrozumieniem, jak zastosować je uniwersalnie do obiektów. Kilka linków:http://techtraits.com/Programming/2011/11/20/using-custom-serializers-with-jackson/http://wiki.fasterxml.com/JacksonHowToCustomSerializersPosługiwać sięObjectMapper.convertValue(object, HashMap.class);, iteruj poHashMappary klucz / wartość i zbuduj ciąg (który jestco teraz używam, ale czuję, że konwersje są nadmierne?).Zgaduję, że są inni, o których nie myślę.

Główny post, w którym zajrzałem, toJava: Pobieranie właściwości klasy w celu utworzenia reprezentacji ciągu

Chodzi mi o to, że mam kilka klas, które chcę serializować bez konieczności określania czegoś konkretnego dla każdego. Dlatego myślę, że funkcja używająca refleksji (# 2 powyżej) to jedyny sposób, aby sobie z tym poradzić (jeśli muszę to zrobić ręcznie).

Jeśli to pomoże, przykładem tego, co mam na myśli, jest, powiedzmy, te dwie klasy:

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
}

(nie, nazwy właściwości i konwencje nie są tym, czego używa moja rzeczywista aplikacja, to tylko przykład)

Rezultatem serializacji byłobyC1prop1=value&C1prop2=value&C1prop3=value iC2prop1=value&C2prop2=value&C2prop3=value, ale jest tylko jedno miejsce, które definiuje sposób serializacji (już zdefiniowane gdzieś lub utworzone ręcznie przeze mnie).

Więc moim pomysłem jest to, że będę musiał skończyć z następującą formą (zaczerpniętą z posta, który umieściłem powyżej):

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();
}

I zmodyfikuj go, aby zaakceptować obiekt, i zmień format elementów dołączonych doStringBuilder. To działa dla mnie, nie potrzebuję teraz pomocy, modyfikując to.

Tak więc znowu moje główne pytanie brzmi, czy jest coś, co już obsługuje tę (potencjalnie prostą) serializację zamiast mnie (szybko) modyfikować powyższą funkcję, nawet jeśli muszę określić, jak postępować z każdą właściwością i wartością oraz jak łączyć każdy?

Jeśli to pomoże, tłem jest to, że używamRestTemplate (Spring), aby wysłać żądanie GET do innego serwera, i chcę przekazać właściwości / wartości określonego obiektu w adresie URL. Rozumiem, że mogę użyć czegoś takiego:

restTemplate.getForObject("URL?C1prop1={C1Prop1}&...", String.class, C1Object);

Wierzę, że właściwości zostaną automatycznie zmapowane. Ale tak jak powiedziałem, nie chcę tworzyć innego szablonu URL i metody dla każdego typu obiektu. Mam nadzieję, że będę miał coś takiego:

public String getRequest(String url, Object obj) {
    String serializedUri = SERIALIZE_URI(obj);
    String response = restTemplate.getForObject("URL?" + serializedUri, String.class);
    return response;
}

gdzieSERIALIZE_URI gdzie bym sobie poradził. I mógłbym to nazwaćgetRequest("whatever", C1Object); igetRequest("whateverElse", C2Object);.

questionAnswers(2)

yourAnswerToTheQuestion