mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-13 08:53:20 +00:00
ICU-6449 Fixed a DecimalFormat serialization problem.
X-SVN-Rev: 24392
This commit is contained in:
parent
d0c5181727
commit
533230d142
2 changed files with 25 additions and 3 deletions
icu4j/src/com/ibm/icu
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue