首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用不可序列化部分的Java序列化

使用不可序列化部分的Java序列化
EN

Stack Overflow用户
提问于 2008-09-18 18:15:16
回答 6查看 100.1K关注 0票数 52

我有:

代码语言:javascript
复制
class MyClass extends MyClass2 implements Serializable {
  //...
}

在MyClass2中是一个不可序列化的属性。我如何序列化(和反序列化)这个对象?

更正: MyClass2当然不是一个接口,而是一个类。

EN

回答 6

Stack Overflow用户

发布于 2008-09-18 18:17:25

MyClass2只是一个接口,所以从技术上讲,它没有属性,只有方法。也就是说,如果您的实例变量本身是不可序列化的,我所知道的唯一解决方法就是将这些字段声明为瞬态的。

例如:

代码语言:javascript
复制
private transient Foo foo;

当您声明一个字段是瞬态的时,它将在序列化和反序列化过程中被忽略。请记住,当您使用瞬态字段反序列化一个对象时,该字段的值将始终是它的默认值(通常为空)。

注您还可以重写类的readResolve()方法,以便基于其他系统状态初始化瞬态字段。

票数 36
EN

Stack Overflow用户

发布于 2012-11-13 00:51:06

如果可能,可以将非序列化部分设置为瞬态部分。

代码语言:javascript
复制
private transient SomeClass myClz;

否则,您可以使用Kryo。Kryo是一个快速高效的Java对象图序列化框架(例如,java.awt.Color的JAVA序列化需要170个字节,Kryo只需要4个字节),它也可以序列化不可序列化的对象。Kryo还可以执行自动的深层和浅层复制/克隆。这是从对象到对象的直接复制,而不是object->bytes->object

下面是一个如何使用kryo的示例

代码语言:javascript
复制
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();

序列化的对象也可以通过注册精确的序列化程序来压缩:

代码语言:javascript
复制
kryo.register(SomeObject.class, new DeflateCompressor(new FieldSerializer(kryo, SomeObject.class)));
票数 15
EN

Stack Overflow用户

发布于 2008-09-18 18:22:57

如果您可以修改MyClass2,则解决此问题的最简单方法是将属性声明为瞬态。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/95181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档