2011-05-06 43 views
2

我有一些代码在序列化我的包含DecimalFormat数字的类之一。这直到2.3.4。我该如何解决?序列化2.3.4中DecimalFormatSymbols的问题

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 serializeQuotes() { 
     FileOutputStream fos; 
     try { 
      fos = openFileOutput(Constants.FILENAME, Context.MODE_PRIVATE); 
      ObjectOutputStream oos = new ObjectOutputStream(fos); 
      oos.writeObject(quotes); //this is an ArrayList<Quote> 
      oos.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

回答

1

你为什么序列化DecimalFormat?用static替换实例DecimalFormat字段。如果需要并发处理,请使用static ThreadLocal<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... 

} 

http://download.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html

+0

我序列化DecimalFormat的,因为我有一个要求,保存价值的文件系统。 – 2011-05-07 00:09:42

+0

是的,但是'DecimalFormat'字段在您提供的代码中是常量。它们可以被声明为“final”,并且代码可以在不作任何其他更改的情况下进行编译。它们不用于'equals()'或'hashCode()'。通过任何获得者都无法看到它们。每个实例都完全相同。它们仅用于调整其他值。如果并发不是一个考虑因素,那么可以将它们设置为'static' _and_' final',而不需要修改其他代码。唯一的原因是您需要每个DecimalFormat的多个实例,因为这些对象不是线程安全的。 – 2011-05-07 00:17:41