我对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);
这样做会生成一个"缺少no-arg构造函数"例外。所以我设置了回退实例化策略:
((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反序列化不会调用构造函数(除了第一个不能实现可序列化的超类中的no-arg之外),但是如果你还没告诉kryo将实例化策略设置为StdInstantiatorStrategy(),它还是会尝试使用构造函数吗?或者它使用JavaSerializer的事实是否使用了其他实例化策略? (这可能会使实例化策略特定于序列化器?
我希望这是有道理的,如果它没有,请告诉我!