code: private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
          in.defaultReadObject();
          // ICU 4.8 custom deserialization.
          String languageTag = (String)in.readObject();
          ulocale = ULocale.forLanguageTag(languageTag);
          MessagePattern.ApostropheMode aposMode = (MessagePattern.ApostropheMode)in.readObject();
          if (msgPattern == null || aposMode != msgPattern.getApostropheMode()) {
              msgPattern = new MessagePattern(aposMode);
          }
          String msg = (String)in.readObject();
          if (msg != null) {
              applyPattern(msg);
          }
          // custom formatters
          for (int numFormatters = in.readInt(); numFormatters > 0; --numFormatters) {
              int formatIndex = in.readInt();
              Format formatter = (Format)in.readObject();
              setFormat(formatIndex, formatter);
          }
          // skip future (int, Object) pairs
          for (int numPairs = in.readInt(); numPairs > 0; --numPairs) {
              in.readInt();
              in.readObject();
          }
      }
docs: Custom deserialization, new in ICU 4.8. See comments on writeObject().
  @throws InvalidObjectException if the objects read from the stream is invalid.