Search code examples
javaexceptionserializable

notSerializableException thrown for Class containing primitive data members


Android Studio keeps throwing the following error log

12-29 16:13:39.092 9311-9311/com.cg.watbalance W/System.err: Caused by: java.io.NotSerializableException: com.cg.watbalance.balancescreen$WatCardData
12-29 16:13:39.092 9311-9311/com.cg.watbalance W/System.err:     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344)
12-29 16:13:39.092 9311-9311/com.cg.watbalance W/System.err:     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
12-29 16:13:39.092 9311-9311/com.cg.watbalance W/System.err:     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
12-29 16:13:39.092 9311-9311/com.cg.watbalance W/System.err:     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)`

The WatCardData Class is as follows

public static class WatCardData implements java.io.Serializable{
    private String FirstName;
    private Double MP, FD, Other, Total;
    private Date Date;

    public WatCardData(Document myDoc) {
        Elements myTDTags = myDoc.getElementsByTag("TD");
        Element myNameTag = myDoc.getElementById("oneweb_account_name");
        String TempFirstName = myNameTag.text().split(",")[1];
        if (TempFirstName == null || TempFirstName.length() == 0) {
                FirstName = TempFirstName;
        }
        else {
            FirstName = WordUtils.capitalizeFully(TempFirstName.substring(0, TempFirstName.length()-1));
        }
        MP = Double.valueOf(myTDTags.get(7).text()) + Double.valueOf(myTDTags.get(14).text()) + Double.valueOf(myTDTags.get(21).text()) + Double.valueOf(myTDTags.get(49).text());
        FD = Double.valueOf(myTDTags.get(42).text()) + Double.valueOf(myTDTags.get(35).text()) + Double.valueOf(myTDTags.get(28).text());
        Other = Double.valueOf(myTDTags.get(56).text()) + Double.valueOf(myTDTags.get(63).text()) + Double.valueOf(myTDTags.get(70).text()) + Double.valueOf(myTDTags.get(77).text()) + Double.valueOf(myTDTags.get(84).text());
        Total = Double.valueOf(myTDTags.get(91).text().substring(2));
        Date = new Date();
    }

    private String getMPString() {
        return "$" + MP;
    }

    private String getFDString() {
        return "$" + FD;
    }

    private String getOtherString() {
        return "$" + Other;
    }

    private String getFirstName(){
        return FirstName+"'s WatCard";
    }

    private String getTotalString() {
        return "$" + Total;
    }

    private String getDateString() {
        String txt = DateUtils.getRelativeTimeSpanString(Date.getTime()).toString();
        if (txt.equals("0 minutes ago")) {
            return "Now";
        } else {
            return txt;
        }
    }
}

My Object Write Code is as follows

                            try {
                                FileOutputStream fos = balancescreen.this.openFileOutput("lastBalance", Context.MODE_PRIVATE);
                                ObjectOutputStream os = new ObjectOutputStream(fos);
                                os.writeObject(myData);
                                Log.d("DATA","WRITTEN");
                                os.close();
                                fos.close();
                            } catch(Exception e) {
                                e.printStackTrace();
                            }

Why am I unable to write the myData object to a file? I've tried making all Variables transient, but that doesn't work either!


Solution

  • I did not have all your packages, so I simplified the constructor to initialize each instance variable with a constant value.

    public WatCardData() {
        this.Date = new Date();
        this.FirstName = "Fred";
        this.MP = 12.3;
        this.FD = 12.3;
        this.Other = 12.3;
        this.Total = 12.3;
    }
    

    I did not have balanceScreen, so I just created a FileOutputStream and used the rest of your code. I did not know the class for myData, so I assumed it was WatCardData.

        WatCardData myData = new WatCardData();
        try {
            FileOutputStream fos = new FileOutputStream("lastBalance");
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(myData);
            os.close();
            fos.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    

    I do not think these changes are significant. I was able to serialize the class.