Non transitoires non sérialisable champ d'instance dans la classe sérialisable
Considérons le code suivant :
public class LIMSGrid extends ClientEventSource implements Focusable, FramingBlockWrapper {
//cell that is curently in edit mode
private CellCoord editingCell = null;
//framing block info
private FramingBlock framingBlock;
}
Maintenant ClientEventSource
s'étend une classe qui implémente Serializable
interface . Les classes CellCoord
et FramingBlock
sont des POJO avec un tas de getters et setters . FindBugs est de se plaindre de la editingCell
et framingBlock
champs en disant :
Cette classe Sérialisable définit un non-primitif champ d'instance qui
n'est ni transitoire, Serializable, ou java.lang.De l'objet, et ne pas
apparaissent pour mettre en œuvre l'interface Externalizable ou les méthodes readObject()
et writeObject() méthodes. les Objets de cette classe ne sera pas
désérialisé correctement si non Sérialisable objet est stocké dans ce
champ.
Bon alors tout est bien sauf comment se fait-il dit que les champs d'instance ne sont pas "de java.lang.L'objet" . C'est tout à fait trompeuse ou il me manque quelques notions de base ici ?
Object
s (évidemment) et Object
ne pas mettre en œuvre Serializable
. Il ne fait aucun sens pour moi. Ma suggestion: faire de ces 2 classes sérialisables ou transitoire et passer 😀 .double possible de FindBugs - SE_BAD_FIELD règle, pourquoi il ignore java.lang.Objet?
pas tout à fait un doublon mais merci pour la réponse à cette question. Il est utile.
Ce qui doit être fait si nous obtenons ci-dessus, à cause de byte[] utilisé dans une classe Sérialisée?
OriginalL'auteur Geek | 2012-07-27
Vous devez vous connecter pour publier un commentaire.
Je pense (mais ce n'est qu'une supposition), c'est que FindBugs ne pas déclencher cet avertissement si vous faites référence à
java.lang.object
cas, car elle estime que, dans ce cas, votre classe est un conteneur générique, qui peut contenir tout type d'objet (comme une Collection).Dans ce cas, il est de la responsabilité de l'utilisateur de la classe pour s'assurer que l'objet stocké dans le conteneur est sérialisable si il veut le conteneur être sérialisable. (tout comme une ArrayList est sérialisable si et seulement si vous stockez des objets sérialisables à l'intérieur de la liste).
OriginalL'auteur JB Nizet
Vous devriez faire CellCoord et FramingBlock serializable d'éviter cette erreur. Si vous ne voulez pas sérialiser entre eux, vous devez les définir comme étant transitoire.
OriginalL'auteur Kurt Du Bois
Les objets des classes ne sera pas désérialiser correctement s'il est une de l'objet défini dans la classe de l'extension de la serializable non-primitif champ d'instance qui n'est ni transitoire, Serializable. parce que si tout objet de la classe souhaitez enregistrer le son de l'etat , il ne sera pas en mesure de le faire simplement parce que d'un non-primitif champ d'instance qui n'est ni transitoire, Serializable.
OriginalL'auteur Shivam