Wie serialisiere ich ein beliebiges Objekt in einen URI?

Meine Grundfrage: Gibt es irgendetwas, das dies bereits automatisch erledigt (muss nicht Teil einer populären Bibliothek / eines populären Pakets sein)? Ich arbeite hauptsächlich mit Spring (MVC) und Jackson2.

Ich verstehe, dass es ein paar manuelle Möglichkeiten gibt, dies zu tun:

Erstellen Sie in jeder Klasse eine Methode, in die die spezifischen Eigenschaften serialisiert werdenproperty=value& form (irgendwie stinkt es, weil es ein Haufen logischer Vervielfältigung ist, glaube ich).Erstellen Sie eine Funktion, die ein Objekt akzeptiert, und verwenden Sie Reflection, um alle Eigenschaften dynamisch zu lesen (ich denke, die Getter), und erstellen Sie die Zeichenfolge, indem Sie jedes abrufen. Ich gehe davon aus, dass Jackson so für die Serialisierung / Deserialisierung im Allgemeinen arbeitet, aber ich weiß es wirklich nicht.Verwenden Sie eine Funktion von Jackson, um das Objekt benutzerdefiniert zu serialisieren. Ich habe nach benutzerdefinierten Serialisierern gesucht, aber es scheint, dass sie spezifisch für eine Klasse sind (also müsste ich eine für jede Klasse erstellen, die ich serialisieren möchte), während ich auf einen generischen Weg gehofft habe. Ich habe nur Probleme zu verstehen, wie man eine universelle Anwendung auf Objekte anwendet. Einige der Links:http://techtraits.com/Programming/2011/11/20/using-custom-serializers-with-jackson/http://wiki.fasterxml.com/JacksonHowToCustomSerializersBenutzenObjectMapper.convertValue(object, HashMap.class);iterieren über dieHashMap's Schlüssel / Wert - Paare, und erstellen Sie die Zeichenfolge (das istwas ich jetzt benutze, aber ich finde die Conversions zu hoch?).Ich schätze, es gibt andere, an die ich nicht denke.

Der Hauptbeitrag, den ich mir angesehen habe, istJava: Die Eigenschaften einer Klasse abrufen, um eine Zeichenfolgendarstellung zu erstellen

Mein Punkt ist, dass ich mehrere Klassen habe, die ich serialisieren möchte, ohne für jede etwas Spezifisches angeben zu müssen. Aus diesem Grund denke ich, dass eine Funktion mit Reflektion (Nr. 2 oben) der einzige Weg ist, dies zu handhaben (wenn ich es manuell tun muss).

Wenn es hilft, ist ein Beispiel für das, was ich meine, zum Beispiel mit diesen zwei Klassen:

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
}

(Nein, die Namen und Konventionen der Eigenschaften sind nicht das, was meine eigentliche App verwendet. Es ist nur ein Beispiel.)

Das Ergebnis der Serialisierung wäreC1prop1=value&C1prop2=value&C1prop3=value undC2prop1=value&C2prop2=value&C2prop3=value, aber es gibt nur einen Ort, der definiert, wie die Serialisierung abläuft (irgendwo bereits definiert oder manuell von mir erstellt).

Meine Idee ist also, dass ich eine der folgenden Formen verwenden muss (entnommen aus dem Beitrag, den ich oben verlinkt habe):

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

Ändern Sie es, um ein Objekt zu akzeptieren, und ändern Sie das Format der an das Element angehängten ElementeStringBuilder. Das funktioniert für mich, ich brauche keine Hilfe, um das jetzt zu ändern.

Daher ist meine Hauptfrage, ob es etwas gibt, das diese (möglicherweise einfache) Serialisierung bereits beherrscht, anstatt dass ich die obige Funktion (schnell) ändern muss, auch wenn ich angeben muss, wie mit jeder Eigenschaft und jedem Wert umzugehen ist und wie sie zu kombinieren sind jeder?

Wenn es hilft, ist der Hintergrund, dass ich a benutzeRestTemplate (Spring), um eine GET-Anforderung an einen anderen Server zu senden, und ich möchte die Eigenschaften / Werte eines bestimmten Objekts in der URL übergeben. Ich verstehe, dass ich so etwas verwenden kann:

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

Ich glaube, die Eigenschaften werden automatisch zugeordnet. Aber wie gesagt, ich möchte nicht für jeden Objekttyp eine andere URL-Vorlage und Methode erstellen müssen. Ich hoffe etwas wie das Folgende zu haben:

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

woherSERIALIZE_URI ist, wo ich damit umgehen würde. Und ich könnte es so nennengetRequest("whatever", C1Object); undgetRequest("whateverElse", C2Object);.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage