ICU-6449 Fixed a DecimalFormat serialization problem.

X-SVN-Rev: 24392
This commit is contained in:
Yoshito Umaoka 2008-07-18 17:00:42 +00:00
parent d0c5181727
commit 533230d142
2 changed files with 25 additions and 3 deletions
icu4j/src/com/ibm/icu
dev/test/serializable
text

View file

@ -9,6 +9,7 @@
package com.ibm.icu.dev.test.serializable;
import java.text.AttributedCharacterIterator;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
@ -18,7 +19,6 @@ import com.ibm.icu.text.ChineseDateFormat;
import com.ibm.icu.text.ChineseDateFormatSymbols;
import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.DateFormatSymbols;
import com.ibm.icu.util.DateInterval;
import com.ibm.icu.text.DateIntervalFormat;
import com.ibm.icu.text.DateIntervalInfo;
import com.ibm.icu.text.DecimalFormat;
@ -32,6 +32,7 @@ import com.ibm.icu.text.RuleBasedNumberFormat;
import com.ibm.icu.text.SimpleDateFormat;
import com.ibm.icu.text.TimeUnitFormat;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.DateInterval;
import com.ibm.icu.util.GregorianCalendar;
import com.ibm.icu.util.TimeUnit;
import com.ibm.icu.util.TimeUnitAmount;
@ -1099,7 +1100,20 @@ public class FormatTests
formats[i] = getCannedDecimalFormat("#,##0.###", uloc);
}
if (formats[0] != null) {
// Ticket#6449
// Once formatToCharacterIterator is called, NumberFormat.Field
// instances are created and stored in the private List field.
// NumberForamt.Field is not a serializable, so serializing such
// instances end up NotSerializableException. This problem was
// reproduced since formatToCharacterIterator was introduced,
// up to ICU 4.0.
AttributedCharacterIterator aci = formats[0].formatToCharacterIterator(new Double(12.345D));
if (aci == null) {} // NOP - for resolving 'Unused local variable' warning.
}
return formats;
}
}

View file

@ -4495,7 +4495,15 @@ public class DecimalFormat extends NumberFormat {
// roundingIncrement = roundingIncrementICU.toBigDecimal();
// }
stream.defaultWriteObject();
// Ticket#6449
// Format.Field instances are not serializable. When formatToCharacterIterator
// is called, attributes (ArrayList) stores FieldPosition instances with
// NumberFormat.Field. Because NumberFormat.Field is not serializable, we need
// to clear the contents of the list when writeObject is called. We could remove
// the field or make it transient, but it will break serialization compatibility.
attributes.clear();
stream.defaultWriteObject();
}
//#endif