Was ist ein guter Weg, um eine Klasse unserializable?
Java enthält eine Menge von Klassen (wie in Swing), die Umsetzung der gefürchtete und fehleranfällig interface Serializable
.
Wenn Sie, sagen, implementieren ein neues TableModel
durch die Erweiterung AbstractTableModel
, das neue Modell muss serialisierbar sein, aber was ist, wenn es mit internen Datentypen, die nicht serialisierbar sind und welche nicht, da Sie nicht Vorhaben, um diese Funktion zu verwenden überhaupt?
In diesem Fall tools wie Sonar verrückt. Die entweder beschweren sich, dass "Klasse Foo
definiert, nicht-transiente nicht-serialisierbaren Instanz-Feld bar
".
Also habe ich das Feld transient
nur, um "Das Feld Foo.bar
ist vorübergehend, aber nicht durch Deserialisierung"
Ist es möglich zu sagen, "Nein, diese Klasse nicht serializable ist, und ich nicht wollen, es zu sein" in einer Weise, dass Sie keine Fehler in tools wie Sonar?
- Tut Sonar-Unterstützung Unterdrückung einer Warnung für eine einzelne Klasse? In IntelliJ es gibt Ihnen die option zum hinzufügen einer @SuppressWarning, um die Klasse für Sie für diese Prüfung.
- Sonar läuft einfach FindBugs, PMD und CheckStyle auf den code und aggregiert die Ergebnisse. Also eine Lösung, die hält diese drei ruhig für mich arbeiten würde.
@SuppressWarning
funktioniert wie erwartet. Es gibt auch plugins, die es erlauben, Warnungen ignorieren, indem Sie Dinge wie Datei -, Pfad-oder String-Muster. - Nicht, dass das, was 'transient' ist für?
- Ich bereits beantwortet in meiner Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zitaten aus dieser JavaRevisited Artikel (siehe #8):
So müssen Sie nur fügen Sie diese in Ihre Klasse:
NotSerializableException
NotSerializableException
.implementieren
writeObject()
undreadObject()
Methoden zu werfenNotSerializableException
oder
http://docs.oracle.com/javase/6/docs/platform/serialization/spec/security.html#4214
Können Sie so etwas wie, dass?
Werden Sie unterdrücken die Findbug Warnung. Sie können auch angeben, die Validierung soll suprres wie:
Die komplette Liste gibt es: http://findbugs.sourceforge.net/bugDescriptions.html
transient
weil FindBugs meckert über das Feld nicht serialisierbar. Was ich Suche ist ein Weg, zu sagen, Sonar, dass die Klasse nicht und wird nicht serialisiert werden.Kann ich denken über die Implementierung von Methode
private void writeObject()
wie folgt:Alternativ können Sie implementieren
Externalizable
und und schreiben, ähnlich der Umsetzung vonwriteExternal()
Beide sind nicht "gute" Methoden, sondern nur workarounds.
Die Antworten, ich sehe hier eigentlich nur Antworten, ob es möglich ist, zu verhindern, dass die Serialisierung oder Deserialisierung der Klasse serializable markiert. Die Frage war eine andere, aber:
'Ist es möglich zu sagen, "Nein, diese Klasse nicht serializable ist, und ich nicht wollen, es zu sein" in einer Weise, dass Sie keine Fehler in tools wie Sonar?'
(Also ich wundere mich über die vielen up-votes auf die Antworten...)
Google ' Ing um die Antwort scheint zu sein, 'Nein', Sonar kann gesagt werden, dass solch eine Klasse ist eine "false positive", aber das erfordert basteln mit Sonar. Entwickler, die code entwickeln, die anschließend von anderen Menschen Sonar nicht nutzen diese Möglichkeit.
Und wie die Frage eigentlich fragt nach einer Lösung für andere "- tools wie Sonar", auch die Antwort im Allgemeinen nicht "ja" --- sicher, dass einige solche Tools bestehen auf "implements Serializable + hat nicht-serialisierbaren, nicht transient Feld" zu bedeuten ärger.