2016-08-31 5 views
0

Sonarqube gibt folgende Fehler:Wie kann ein generischer Typ serialisiert werden?

Fabrikat "Typ" transient oder serializable.

Auf der folgenden Klasse:

@XmlRootElement 
public class InsuredAmount<T extends IAType> implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private T type; 
} 

IAType ist eine Schnittstelle:

public interface IAType { 

} 

Mit verschiedenen Enum-Implementierungen, wie:

public enum OneIAType implements IAType, Serializable { 

    GENERIC 

} 

Die Klasse in ein verwendet wird, REST-Schnittstelle, so sollte es Serializa sein ble.

Meine Fragen: 1. Ich denke nicht, den Typ als transient zu markieren, ist eine gute Idee, weil ich diese Klasse über eine REST-Schnittstelle übertrage. Kann es zu einem Problem führen, wenn ich diesen Typ als vorübergehend markiere? 2. Wie kann ich den Typ serialisierbar machen?

+3

Deklarieren der Art Variable als [Kreuzungstyp] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html# JLS-4.9): ''? –

+0

Mögliche Duplikat von [Wie eine generische Klasse in Java Serialisierung?] (Http://stackoverflow.com/questions/16852247/how-to-serialize-a-generic-class-in-java) – acm

Antwort

3
  1. Kann es zu einem Problem führen, wenn ich diese Art als vorübergehende markieren?

Hängt, wenn Sie den Wert im Feld benötigen, nachdem Sie die Instanz deserialisieren. Wenn Sie dies tun, können Sie es markieren , aber Sie brauchen eine andere Möglichkeit, um die notwendigen Informationen zu übertragen, um den Wert von type am fernen Ende zu rekonstruieren.

  1. Wie kann ich den Typ serialisierbar machen?

den Variablentyp Deklarieren als intersection type:

<T extends IAType & Serializable> 

Edit: es scheint, dass dieser Vorschlag nicht von Sonarqube als serializable Typ erkannt wird.

In der Frage heißt es, dass die Implementierungen der Schnittstelle enums sind; Das legt nahe, dass eine alternative Möglichkeit, um die gebundenen auszudrücken wäre:

<T extends Enum<T> & IAType> 

Beachten Sie, dass alle Aufzählungen implizit serializable sind, so Serializable nicht explizit in der Schnittstelle sein muss eingeben.

Es stellt sich heraus, dass diese Art und Weise arbeitet, während der erste Weg nicht der Fall ist: can be assigned to a variable of type Serializable Referenzen beider Typen. (Vielleicht ist es ein Fehler in Sonarqube?)

+0

Ja ich brauche das Feld nach der Deserialisierung.Ich habe versucht, die Option '& Serializable' zum Typ hinzuzufügen, aber der SonarQube-Fehler bleibt bestehen. –

+0

http://stackoverflow.com/questions/38432990/sonarqube-does-not-recognise-serializable-generic-types Es sieht so aus, als hätte jemand anderes nach dem gleichen Problem gefragt (aber ohne Antwort). –

+0

Wenn alle Ihre 'IAType'-Implementierungen Enums sind, können Sie ' & IAType>' deklarieren? Erkennt Sonarqube das als serialisierbar? –

Verwandte Themen