我对 Kryo 很陌生,所以如果我犯了一个愚蠢的错误,请原谅我......我已经阅读了手册,并且我想我大致了解 Kryo 是如何序列化的,但是我在反序列化 JComboBox 时遇到了麻烦。
首先,我试过这个:
Kryo kryo = new Kryo();
Output output = new Output(new FileOutputStream("/tempTest/newTest.kr"));
JComboBox objectToWrite = new JComboBox();
kryo.writeObject(output, objectToWrite);
output.flush();
output.close();
然后读...
Input input = new Input(new FileInputStream("/tempTest/newTest.kr"));
JComboBox cbox = kryo.readObject(input, JComboBox.class);
这样做会生成“缺少无参数构造函数”异常。所以我设置了回退实例化策略:
((DefaultInstantiatorStrategy) kryo.getInstantiatorStrategy()).setFallbackInstantiatorStrategy(new StdInstantiatorStrategy());
但是,现在我得到了这个例外:
Exception in thread "main" java.lang.IllegalAccessError: tried to access method javax.swing.plaf.metal.MetalComboBoxButton.<init>()V from class javax.swing.plaf.metal.MetalComboBoxButtonConstructorAccess
at javax.swing.plaf.metal.MetalComboBoxButtonConstructorAccess.newInstance(Unknown Source)
at com.esotericsoftware.kryo.Kryo$DefaultInstantiatorStrategy$1.newInstance(Kryo.java:1193)
at com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1061)
at com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:547)
at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:523)
at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:761)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:116)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:22)
at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:679)
at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:106)
at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:528)
at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:657)
at T2SaveLoad.saveLoad(T2SaveLoad.java:112)
at T2SaveLoad.main(T2SaveLoad.java:40)
我不确定到底发生了什么,有人可以帮忙吗?
另外,kryo 是如何选择实例化策略的?每个序列化程序是否有不同的实例化策略,或者 kryo 对它反序列化的所有对象只有一个默认值和一个后备?
如果你这样做:
kryo.register(JComboBox.class, new JavaSerializer());
(实际上它确实序列化/反序列化没有任何错误) - 本机 java 反序列化不调用构造函数(除了第一个不实现可序列化的超类中的无参数),但是如果你没有告诉 kryo将实例化策略设置为 StdInstantiatorStrategy(),它是否仍然尝试使用构造函数?或者它使用它的 JavaSerializer 的事实是否使它使用其他一些实例化策略?(这可能会使实例化策略序列化程序特定于?
我希望这是有道理的,如果没有,请告诉我!!