Java自定义序列化

我有一个对象,其中包含一些要序列化的不可序列化字段。它们来自我无法更改的单独API,因此使它们可序列化不是一种选择。主要问题是Location类。它包含我需要的四个可以序列化的东西,所有整数。如何使用read / writeObject创建可以执行以下操作的自定义序列化方法:

// writeObject:

List<Integer> loc = new ArrayList<Integer>();

loc.add(location.x);

loc.add(location.y);

loc.add(location.z);

loc.add(location.uid);

// ... serialization code

// readObject:

List<Integer> loc = deserialize(); // Replace with real deserialization

location = new Location(loc.get(0), loc.get(1), loc.get(2), loc.get(3));

// ... more code

我怎样才能做到这一点?

回答:

Java支持自定义序列化。阅读“自定义默认协议”部分。

去引用:

但是,有一个奇怪但狡猾的解决方案。通过使用序列化机制的内置功能,开发人员可以通过在类文件中提供两种方法来增强常规过程。这些方法是:

  • private void writeObject(ObjectOutputStream out) throws IOException;
  • private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

在此方法中,如果需要,你可以将其序列化为其他形式,例如你说明的ArrayList或JSON或其他数据格式/方法,然后将其重新构造回readObject()

在你的示例中,添加以下代码:

private void writeObject(ObjectOutputStream oos)

throws IOException {

// default serialization

oos.defaultWriteObject();

// write the object

List loc = new ArrayList();

loc.add(location.x);

loc.add(location.y);

loc.add(location.z);

loc.add(location.uid);

oos.writeObject(loc);

}

private void readObject(ObjectInputStream ois)

throws ClassNotFoundException, IOException {

// default deserialization

ois.defaultReadObject();

List loc = (List)ois.readObject(); // Replace with real deserialization

location = new Location(loc.get(0), loc.get(1), loc.get(2), loc.get(3));

// ... more code

}

以上是 Java自定义序列化 的全部内容, 来源链接: utcz.com/qa/408092.html

回到顶部