[英]kryo serializer serializing iCal4j Calendar fails "Class cannot be created (missing no-arg constructor)"
我嘗試將 kryo 實施到現有項目中。
我的項目有一個 class“日歷”,帶有 iCal4j object:
public class Calendar implements Serializable{
private static final long serialVersionUID = 1L;
private net.fortuna.ical4j.model.Calendar calendar;
private VTimeZone timezone;
/*
* constructor
*/
public Calendar() {
super();
//Create a TimeZone
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
this.timezone = registry.getTimeZone("Europe/Berlin").getVTimeZone();
// Create a calendar
this.calendar = createCalendar();
}
kryo 代碼:
Kryo kryo = new Kryo();
kryo.setRegistrationRequired(false);
kryo.setReferences(true);
kryo.register(DateTime.class, new JodaDateTimeSerializer());
kryo.register(java.util.UUID.class, new UUIDSerializer());
kryo.register(net.fortuna.ical4j.model.component.VEvent.class, new Ical4jVEventSerializer());
kryo.register(net.fortuna.ical4j.model.property.CalScale.class, new JavaSerializer());
EstateManager earth = (EstateManager) o;
Output output = new Output(new FileOutputStream(filekyro));
kryo.writeClassAndObject(output, earth.getApplicants().get(0));
output.close();
當嘗試序列化時,出現以下錯誤:
com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg
constructor): net.fortuna.ical4j.model.property.CalScale$ImmutableCalScale
Serialization trace:
properties (net.fortuna.ical4j.model.Calendar)
calendar (core.Calendar)
calendar (core.EstateManager)
earth (core.Country)
country (core.City)
city (core.Applicant)
at com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy.newInstantiatorOf(DefaultInstantiatorStrategy.java:111)
at com.esotericsoftware.kryo.Kryo.newInstantiator(Kryo.java:1190)
at com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1199)
at com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:163)
at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:122)
據我了解,kryo 帶有許多標准序列化程序並嘗試使用其中一個,通常是這個字段序列化程序,我可以為 ical4j 編寫自己的序列化程序,或者使用 java 序列化程序(我在代碼中做了)以上),甚至失敗。
我還試圖找到一個專用的 ical4j-serializer,找到了這個https://github.com/ical4j/ical4j-serializer但我認為我不能將它與 kryo 一起使用,因為它沒有實現 kryo 接口,對吧?
還是有問題,我為“net.fortuna.ical4j.model.property.CalScale”提供了一個序列化程序,但沒有為“net.fortuna.ical4j.model.property.CalScale$ImmutableCalScale”提供序列化程序? 如果是這樣,我該怎么做?
kryo.register(net.fortuna.ical4j.model.property.CalScale$ImmutableCalScale, new JavaSerializer());
也失敗(無法解析為類型)
那么我在這里有什么選擇或者我錯過了什么? 任何幫助都非常感謝:-)
如果您在代碼中構建日歷 object(即與解析文件相反),您可能想嘗試不使用不可變屬性。
例如,使用 CalScale,您可以嘗試:
new CalScale(CalScale.VALUE_GREGORIAN)
雖然不可變屬性沒有默認構造函數,但可變屬性有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.