我有:
class MyClass extends MyClass2 implements Serializable {
//...
}
在MyClass2中是一个不可序列化的属性。我如何序列化(和反序列化)这个对象?
更正: MyClass2当然不是一个接口,而是一个类。
发布于 2008-09-18 18:17:25
MyClass2只是一个接口,所以从技术上讲,它没有属性,只有方法。也就是说,如果您的实例变量本身是不可序列化的,我所知道的唯一解决方法就是将这些字段声明为瞬态的。
例如:
private transient Foo foo;
当您声明一个字段是瞬态的时,它将在序列化和反序列化过程中被忽略。请记住,当您使用瞬态字段反序列化一个对象时,该字段的值将始终是它的默认值(通常为空)。
注您还可以重写类的readResolve()方法,以便基于其他系统状态初始化瞬态字段。
发布于 2012-11-13 00:51:06
如果可能,可以将非序列化部分设置为瞬态部分。
private transient SomeClass myClz;
否则,您可以使用Kryo。Kryo是一个快速高效的Java对象图序列化框架(例如,java.awt.Color的JAVA序列化需要170个字节,Kryo只需要4个字节),它也可以序列化不可序列化的对象。Kryo还可以执行自动的深层和浅层复制/克隆。这是从对象到对象的直接复制,而不是object->bytes->object
。
下面是一个如何使用kryo的示例
Kryo kryo = new Kryo();
// #### Store to disk...
Output output = new Output(new FileOutputStream("file.bin"));
SomeClass someObject = ...
kryo.writeObject(output, someObject);
output.close();
// ### Restore from disk...
Input input = new Input(new FileInputStream("file.bin"));
SomeClass someObject = kryo.readObject(input, SomeClass.class);
input.close();
序列化的对象也可以通过注册精确的序列化程序来压缩:
kryo.register(SomeObject.class, new DeflateCompressor(new FieldSerializer(kryo, SomeObject.class)));
发布于 2008-09-18 18:22:57
如果您可以修改MyClass2,则解决此问题的最简单方法是将属性声明为瞬态。
https://stackoverflow.com/questions/95181
复制相似问题