2016-07-19 14 views
5

Ich versuche Spring Boot zu lernen, indem ich eine einfache REST-API implementiere.Spring MVC - sollten meine Domain-Klassen Serializable für die Über-die-Überweisung implementieren?

Mein Verständnis war, dass wenn ich ein Objekt über die Leitung übertragen muss, sollte das Objekt Serializable implementieren.

In vielen Beispielen im Netz, einschließlich offiziellen, Domain-Klassen, die von Server zu Client (oder umgekehrt) übertragen werden müssen, um Serializable nicht zu implementieren.

Zum Beispiel: https://spring.io/guides/gs/rest-service/

Aber in einigen Fällen, sie tun:

Zum Beispiel: https://github.com/szerhusenBC/jwt-spring-security-demo/blob/master/src/main/java/org/zerhusen/security/JwtAuthenticationRequest.java

Gibt es eine Faustregel, wenn Serializable zu implementieren?

+0

Mögliche Duplikate: http://stackoverflow.com/questions/2020904/when-and-why-jpa-entities-should-implement-serializable-interface – developer

+0

Nur als Hinweis: die verknüpfte Frage und ausgewählte Antwort sind speziell über JPA, während diese Frage über "over-the-Wire" Transfer ist. – glhr

Antwort

3

Wenn Sie die Java-Serialisierungs-API verwenden, benötigen Sie etwas in Java auf der anderen Seite des Drahts, um die Objekte zu deserialisieren. Sie müssen also sowohl den Deserialisierungscode als auch den Serialisierungscode steuern.

In der Regel ist dies für REST-Anwendungen nicht relevant. Wenn Sie die Anwendungsantwort konsumieren, handelt es sich um den Code von jemand anderem, normalerweise außerhalb Ihrer Organisation. Beim Erstellen einer REST-Anwendung ist es normal zu versuchen, keine Beschränkungen für das, was sie verbraucht, aufzuerlegen, indem ein Format gewählt wird, das technologiespezifisch und allgemein verfügbar ist.

ein Objekt serialisierbar sein würde Einige Gründe für die Herstellung:

  • so können Sie es in einem Http

  • so können Sie es zwischen den Ebenen in einer verteilten Anwendung

  • passieren setzen Sie können sie also im Dateisystem speichern und später wiederherstellen (z. B. können Sie den Inhalt einer Warteschlange serialisierbar machen und den Inhalt der Warteschlange speichern, wenn die Anwendung heruntergefahren wird und von der Speicherstelle wh gelesen wird de Die Anwendung beginnt, die Warteschlange beim Herunterfahren in den Status zu versetzen.

1

Es gibt viele Möglichkeiten, ein Objekt zu serialisieren. Die Objektserialisierung von Java ist nur eine davon. Vom official documentation:

Serialisierung eines Objekts bedeutet, seinen Zustand zu einem Byte-Stream

REST-APIs in der Regel senden und empfangen JSON oder XML zu konvertieren. In diesem Fall bedeutet das Serialisieren eines Objekts das Konvertieren seines Status in eine String.

Es gibt keine direkte Verbindung zwischen "Senden eines Objekts über die Leitung" und dem Implementieren von Serializable. Die von Ihnen verwendeten Technologien legen fest, ob Serializable implementiert werden soll oder nicht.

0

Die spezifischen Beispiele, die Sie erwähnt haben, übertragen keine Objekte über den Draht. Aus den Beispiel-Links sehe ich, dass die Controller-Methoden ein Domain-Objekt mit ResponseBody Annotation zurückgeben.Nur weil der Rückgabetyp der Methode das Domänenobjekt ist, ist es nicht notwendig, dass das gesamte Objekt an den Client gesendet wird. Eine der Handlermethoden in Spring mvc framework fängt den Aufruf intern ab und stellt fest, dass der Methodenrückgabetyp nicht in das direkte ModelAndView Objekt übersetzt wird. RequestResponseBoodyMethodProcessor behandelt den Rückgabewert solcher mit Annotationen versehenen Methoden und verwendet einen der Nachrichtenkonverter, um das Rückgabeobjekt in den HTTP-Antworttext zu schreiben. In dem Fall wäre der verwendete Nachrichtenkonverter MappingJackson2HttpMessageConverter. Wenn Sie also demselben Codierungsstil folgen sollen, müssen Sie Serializable nicht für Ihre Domänenobjekte implementieren.

Werfen Sie einen Blick auf diese link für die HTTP-Nachrichtenkonverter standardmäßig von Frühjahr bereitgestellt. Die Liste ist sehr umfangreich aber nicht erschöpfend und wenn Anforderungen auftreten, können Sie Ihren eigenen benutzerdefinierten Nachrichtenkonverter für den Benutzer implementieren.

0

das ist eine gute Frage, wenn serializable Schnittstelle zu implementieren.

diese Links können einige nützliche Inhalte bietet:

Serializing java.io.Serializable instance into JSON with Spring and Jackson JSON

When and why JPA entities should implement Serializable interface?

ich manchmal darüber wundern, und ich denke,

Da Java eine Open-Source-Sprache, und mehr Bibliotheken Von Drittanbietern zur Verfügung gestellt.Für Tells, wer das Objekt serialisieren und deserialisieren wird, deklariert der Java-Offizielle eine Constract-Schnittstelle, macht die Übertragung einfach und Sicherheit durch verschiedene Bibliothek.

Es ist nur eine Constract, die meisten Bibliotheken von Drittanbietern können serialisieren/deserialize bei der Überprüfung implementieren diese constract.and Jacksons Jar-Bibliothek wird nicht verwendet.

So können Sie denken, wenn Sie serialize/deserialize Objektdaten in Ihrem eigenen System verwenden, und einfacher Prozess, likes nur serialisieren und es beantworten (jackson im Frühling MVC), müssen Sie es nicht implementieren. aber wenn Sie in anderen jar-Bibliothek, speichert gerne in HttpSession, oder andere Third-Party-Komponenten/Bibliothek, sollten Sie (oder müssen) Serializable implementieren, sonst werden die Bibliotheken eine Ausnahme werfen, um Ihnen die Constract-Schnittstelle zu sagen, die es kennt ist nicht verfügbar.

Aber sie sagten, es ist eine gute Angewohnheit und beste Eigenschaften, die Serializable zu implementieren, wenn eine benutzerdefinierte Klasse serialisieren. :)