Qual è il modo consigliato per serializzare gli oggetti dipendenti, specialmente quando gli oggetti vengono costruiti di recente (per evitare flussi di byte dannosi o simili)? Ad esempio ....
Dopo aver creato un calendario fiscale basato su JodaTime (generalizzato, ma configurato tramite Spring per la mia azienda) , Sto creando la prossima versione basata su JSR310 (usando la back-port per lo sviluppo) in preparazione per Java 8.
Attualmente sto lavorando alla serializzazione; come posso serializzare gli oggetti dipendenti? La maggior parte delle cose esistenti ha una cronologia "singola", ma non posso fare affidamento su questo (ad esempio, l'anno fiscale può iniziare in qualsiasi giorno durante l'anno ISO, il che significa una nuova FiscalChronology). Qualcosa del genere:
public class FiscalDate implements Serializable {
private final long epochDays;
private final FiscalChronology chronology;
// Many of the other 'date' instances also have a reference to their 'era':
private final transient FiscalEra era;
}
public class FiscalChronology implements Serializable {
// These two control year/month patterns.
private final YearPattern yearPattern;
private final MonthPattern monthPattern;
// This should be derived during deserialization, for safety reasons.
private transient final FiscalEra[] eras;
private Object readResolve() {
return FiscalChronology.create(yearPattern, monthPattern);
}
}
Che cosa faccio per l'era "derivata"?
public class FiscalEra implements Serializable {
// So that eras can be singletons, per JSR310 documentation/recommendations.
private static final ConcurrentHashMap<FiscalChronology, FiscalEra[]>;
private final int eraValue;
private final FiscalChronology chronology;
public static FiscalEra of(FiscalChronology chronology, int era) {
return putIfAbsent(chronology, makeEras(chronology))[era];
}
}
Dovrei semplicemente rimuovere la serializzazione? Solo serializzare eraValue
(e fare affidamento sul grafico di serializzazione inclusa la cronologia per conto proprio)?
EDIT:
In relazione a questo, cosa dovrei fare per l'output di toString()
- dovrebbe essere solo il nome dell'era (che sto collegando alle ere ISO), e mi aspetto che le persone includano le informazioni sulla cronologia se è importante o include sempre informazioni sulla cronologia?