Java 序列化2.3.4中的十进制符号时出现问题

Java 序列化2.3.4中的十进制符号时出现问题,java,android,serialization,io,date-format,Java,Android,Serialization,Io,Date Format,我有一些代码,我正在序列化我的一个类,其中包含一个十进制数。这一直持续到2.3.4。我该如何解决 ERROR/AndroidRuntime(684): java.lang.IllegalArgumentException: no char field 'exponential' 下面是我正在序列化的类: public class Quote implements Serializable { private static final long serialVersionUID =

我有一些代码,我正在序列化我的一个类,其中包含一个十进制数。这一直持续到2.3.4。我该如何解决

ERROR/AndroidRuntime(684): java.lang.IllegalArgumentException: no char field 'exponential'
下面是我正在序列化的类:

public class Quote implements Serializable  {

    private static final long serialVersionUID = 1L;

    private String symbol;
    private String name;
    private String change;
    private String percentChange;
    private String open;
    private String daysHigh;
    private String daysLow;
    private String dividendYield;
    private String volume;
    private String averageDailyVolume;
    private String peRatio;
    private String marketCapitalization;
    private String yearHigh;
    private String yearLow;
    private String lastTradePriceOnly;
    private DecimalFormat df = new DecimalFormat("#,###,###,###,###,##0.00");
    private DecimalFormat vf = new DecimalFormat("#,###,###,###,###,##0");

    public String getSymbol() {
        return symbol;
    }
    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getChange() {
        return change;
    }
    public void setChange(String change) {
        if(change.equals("null")){
            this.change = "N/A";
        }
        else{   
            float floatedChange = Float.valueOf(change);
            this.change = (df.format(floatedChange));
        }
    }
    public String getPercentChange() {
        return percentChange;
    }
    public void setPercentChange(String percentChange) {
        if(percentChange.equals("null"))
            percentChange = "N/A";
        else
            this.percentChange = percentChange;
    }
    public String getOpen() {
        return open;
    }
    public void setOpen(String open) {
        if(open.equals("null"))
            this.open = "N/A";
        else
            this.open = open;
    }
    public String getDaysHigh() {
        return daysHigh;
    }
    public void setDaysHigh(String daysHigh) {
        if(daysHigh.equals("null"))
            this.daysHigh = "N/A";
        else{
            float floatedDaysHigh = Float.valueOf(daysHigh);
            this.daysHigh = (df.format(floatedDaysHigh));
        }
    }
    public String getDaysLow() {
        return daysLow;
    }
    public void setDaysLow(String daysLow) {
        if(daysLow.equals("null"))
            this.daysLow = "N/A";
        else{
            float floatedDaysLow = Float.valueOf(daysLow);
            this.daysLow = (df.format(floatedDaysLow));
        }
    }
    public String getVolume() {
        return volume;
    }
    public void setVolume(String volume) {
        if(volume.equals("null")){
            this.volume = "N/A";
        }
        else{
            float floatedVolume = Float.valueOf(volume);
            this.volume = (vf.format(floatedVolume));
        }
    }
    public String getDividendYield() {
        return dividendYield;
    }
    public void setDividendYield(String dividendYield) {
        if(dividendYield.equals("null"))
            this.dividendYield = "N/A";
        else
            this.dividendYield = dividendYield;
    }
    public String getAverageDailyVolume() {
        return averageDailyVolume;
    }
    public void setAverageDailyVolume(String averageDailyVolume) {
        if(averageDailyVolume.equals("null")){
            this.averageDailyVolume = "N/A";
        }
        else{
            float floatedAverageDailyVolume = Float.valueOf(averageDailyVolume);
            this.averageDailyVolume = (vf.format(floatedAverageDailyVolume));
        }
    }
    public String getPeRatio() {
        return peRatio;
    }
    public void setPeRatio(String peRatio) {
        if(peRatio.equals("null"))
            this.peRatio = "N/A";
            else
        this.peRatio = peRatio;
    }
    public String getMarketCapitalization() {
        return marketCapitalization;
    }
    public void setMarketCapitalization(String marketCapitalization) {
        if(marketCapitalization.equals("null"))
            this.marketCapitalization = "N/A";
        else
            this.marketCapitalization = marketCapitalization;
    }
    public String getYearHigh() {
        return yearHigh;
    }
    public void setYearHigh(String yearHigh) {
        if(yearHigh.equals("null"))
            this.yearHigh = "N/A";
        else
            this.yearHigh = yearHigh;
    }
    public String getYearLow() {
        return yearLow;
    }
    public void setYearLow(String yearLow) {
        if(yearLow.equals("null"))
            this.yearLow = "N/A";
        else
            this.yearLow = yearLow;
    }

    public String getLastTradePriceOnly() {
        return lastTradePriceOnly;
    }

    public void setLastTradePriceOnly(String lastTradePriceOnly) {
        if(lastTradePriceOnly.equals("null")){
            this.lastTradePriceOnly = "N/A";
        }
        else{
            float floatedLastTradePriceOnly = Float.valueOf(lastTradePriceOnly);
            this.lastTradePriceOnly = (df.format(floatedLastTradePriceOnly));
        }
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((change == null) ? 0 : change.hashCode());
        result = prime * result
                + ((daysHigh == null) ? 0 : daysHigh.hashCode());
        result = prime * result + ((daysLow == null) ? 0 : daysLow.hashCode());
        result = prime
                * result
                + ((lastTradePriceOnly == null) ? 0 : lastTradePriceOnly
                        .hashCode());
        result = prime
                * result
                + ((marketCapitalization == null) ? 0 : marketCapitalization
                        .hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((open == null) ? 0 : open.hashCode());
        result = prime * result + ((peRatio == null) ? 0 : peRatio.hashCode());
        result = prime * result
                + ((percentChange == null) ? 0 : percentChange.hashCode());
        result = prime * result + ((symbol == null) ? 0 : symbol.hashCode());
        result = prime * result + ((volume == null) ? 0 : volume.hashCode());
        result = prime * result
                + ((yearHigh == null) ? 0 : yearHigh.hashCode());
        result = prime * result + ((yearLow == null) ? 0 : yearLow.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Quote other = (Quote) obj;
        if (change == null) {
            if (other.change != null)
                return false;
        } else if (!change.equals(other.change))
            return false;
        if (daysHigh == null) {
            if (other.daysHigh != null)
                return false;
        } else if (!daysHigh.equals(other.daysHigh))
            return false;
        if (daysLow == null) {
            if (other.daysLow != null)
                return false;
        } else if (!daysLow.equals(other.daysLow))
            return false;
        if (lastTradePriceOnly == null) {
            if (other.lastTradePriceOnly != null)
                return false;
        } else if (!lastTradePriceOnly.equals(other.lastTradePriceOnly))
            return false;
        if (marketCapitalization == null) {
            if (other.marketCapitalization != null)
                return false;
        } else if (!marketCapitalization.equals(other.marketCapitalization))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (open == null) {
            if (other.open != null)
                return false;
        } else if (!open.equals(other.open))
            return false;
        if (peRatio == null) {
            if (other.peRatio != null)
                return false;
        } else if (!peRatio.equals(other.peRatio))
            return false;
        if (percentChange == null) {
            if (other.percentChange != null)
                return false;
        } else if (!percentChange.equals(other.percentChange))
            return false;
        if (symbol == null) {
            if (other.symbol != null)
                return false;
        } else if (!symbol.equals(other.symbol))
            return false;
        if (volume == null) {
            if (other.volume != null)
                return false;
        } else if (!volume.equals(other.volume))
            return false;
        if (yearHigh == null) {
            if (other.yearHigh != null)
                return false;
        } else if (!yearHigh.equals(other.yearHigh))
            return false;
        if (yearLow == null) {
            if (other.yearLow != null)
                return false;
        } else if (!yearLow.equals(other.yearLow))
            return false;
        return true;
    }
}
下面是我的序列化操作(注意引号是数组列表):

private void序列化引号(){
文件输出流;
试一试{
fos=openFileOutput(Constants.FILENAME,Context.MODE_PRIVATE);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(引号);//这是一个ArrayList
oos.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}

为什么要序列化
十进制格式?将实例
DecimalFormat
字段替换为
static
字段。如果并发是一个问题,请使用
static ThreadLocal
s

public class Quote implements Serializable  {

    private static final long serialVersionUID = 1L;

    private String symbol;
    private String name;
    private String change;
    private String percentChange;
    private String open;
    private String daysHigh;
    private String daysLow;
    private String dividendYield;
    private String volume;
    private String averageDailyVolume;
    private String peRatio;
    private String marketCapitalization;
    private String yearHigh;
    private String yearLow;
    private String lastTradePriceOnly;


    private static final ThreadLocal<DecimalFormat> df = new ThreadLocal<DecimalFormat> {
        @Override
        protected DecimalFormat initialValue() {
            return new DecimalFormat("#,###,###,###,###,##0.00");
        }
    }

    private static final ThreadLocal<DecimalFormat> vf = new ThreadLocal<DecimalFormat> {
        @Override
        protected DecimalFormat initialValue() {
            return new DDecimalFormat("#,###,###,###,###,##0");
        }
    }

    // snip...

}
public类Quote实现可序列化{
私有静态最终长serialVersionUID=1L;
私有字符串符号;
私有字符串名称;
私有字符串更改;
私有字符串更改;
私有字符串打开;
私人字符串daysHigh;
私人字符串daysLow;
私有字符串分割收益率;
私有字符串卷;
私有字符串平均每日体积;
私有字符串操作;
私有字符串市值;
私家侦探高;
私有字符串低;
仅限私人字符串;
私有静态最终ThreadLocal df=新ThreadLocal{
@凌驾
受保护的DecimalFormat initialValue(){
返回新的十进制格式(“#”、“#”、“#”、“0.00”);
}
}
私有静态最终ThreadLocal vf=新ThreadLocal{
@凌驾
受保护的DecimalFormat initialValue(){
返回新的DDecimalFormat(“#,###,##,##,##,##,#0”);
}
}
//剪断。。。
}

我正在序列化DecimalFormat,因为我需要将值保存到文件系统。是的,但是在您提供的代码中,
DecimalFormat
字段是常量。它们可以被声明为
final
,代码将在不做任何其他更改的情况下编译。它们不用于
equals()
hashCode()
中。通过任何getter都看不到它们。它们在每一个实例中都是完全相同的。它们仅用于调整其他值。如果不考虑并发性,则可以在不更改其他代码的情况下将它们设置为
静态
最终
。您需要每个
DecimalFormat
的多个实例的唯一原因是对象不是线程安全的。
public class Quote implements Serializable  {

    private static final long serialVersionUID = 1L;

    private String symbol;
    private String name;
    private String change;
    private String percentChange;
    private String open;
    private String daysHigh;
    private String daysLow;
    private String dividendYield;
    private String volume;
    private String averageDailyVolume;
    private String peRatio;
    private String marketCapitalization;
    private String yearHigh;
    private String yearLow;
    private String lastTradePriceOnly;


    private static final ThreadLocal<DecimalFormat> df = new ThreadLocal<DecimalFormat> {
        @Override
        protected DecimalFormat initialValue() {
            return new DecimalFormat("#,###,###,###,###,##0.00");
        }
    }

    private static final ThreadLocal<DecimalFormat> vf = new ThreadLocal<DecimalFormat> {
        @Override
        protected DecimalFormat initialValue() {
            return new DDecimalFormat("#,###,###,###,###,##0");
        }
    }

    // snip...

}