簡體   English   中英

kryo 序列化程序序列化 iCal4j 日歷失敗“無法創建類(缺少無參數構造函數)”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM