60 votes

Comment sérialiser une valeur NULL lors de l'utilisation d'une interface parcelable

en ce qui concerne mon exemple de code, que dois-je faire si les variables d’un locable sont nulles? Par exemple, maintenant si l.getZoom () renvoie null, je suis NullPointerException.

 @Override
public void writeToParcel(Parcel parcel, int arg1) {
    parcel.writeInt(count);
    for(Locable l:locableArr){
        parcel.writeInt(l.getOriginId());
        parcel.writeInt(l.getLocableType());
        parcel.writeInt(l.getZoom());
        parcel.writeDouble(l.getLatituda());
        parcel.writeDouble(l.getLongituda());
        parcel.writeString(l.getTitle());
        parcel.writeString(l.getSnipet());
    }

}
 

Merci!

104voto

artch Points 780

Vous pouvez utiliser Parcel.writeValue pour organiser un objet générique avec une valeur null.

14voto

David Wasser Points 23169

La plupart des code de sérialisation que j'ai vu utilise des indicateurs pour indiquer la présence ou l'absence d'une valeur OU précède la valeur avec un nombre de champ (par exemple, lors de l'écriture de tableaux) où le champ count est mise à zéro si la valeur n'existe pas du tout.

En examinant le code source d'Android de base des classes révèle code comme ceci (à partir de la classe de Message):

    if (obj != null) {
        try {
            Parcelable p = (Parcelable)obj;
            dest.writeInt(1);
            dest.writeParcelable(p, flags);
        } catch (ClassCastException e) {
            throw new RuntimeException(
                "Can't marshal non-Parcelable objects across processes.");
        }
    } else {
        dest.writeInt(0);
    }

ou ce (à partir de l'Intention de la classe):

    if (mCategories != null) {
        out.writeInt(mCategories.size());
        for (String category : mCategories) {
            out.writeString(category);
        }
    } else {
        out.writeInt(0);
    }

Ma suggestion: Dans votre code, si il n'y a pas de différence fonctionnelle entre "zoom == null" et "zoom == 0", alors que je vient de déclarer zoom primitive (int au lieu de Integer) OU l'initialiser à zéro dans le constructeur et de s'assurer que vous n'avez jamais mis à null (alors vous pouvez être assuré qu'il ne sera jamais nulle, et vous n'aurez pas à ajouter un code spécial pour votre sérialisation/désérialisation des méthodes).

14voto

Felipe Lima Points 2346

Voici la solution que j'ai proposée pour écrire des chaînes en toute sécurité:

 private void writeStringToParcel(Parcel p, String s) {
    p.writeByte((byte)(s != null ? 1 : 0));
    p.writeString(s);
}

private String readStringFromParcel(Parcel p) {
    boolean isPresent = p.readByte() == 1;
    return isPresent ? p.readString() : null;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X