在序列化期间不调用writeObject()和readObject()

时间:2015-11-17 20:15:01

标签: java json serialization gson

我有一个Test类,如下所示:

package examples;

import java.io.IOException;
import java.io.Serializable;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;

public class Test implements Serializable {

  private static final long serialVersionUID = -2174245110865129519L;

  private transient int num = 5;

  /**
   * Write object (Serialization).
   */
  private void writeObject(ObjectOutputStream out) throws IOException {
    System.out.println("Write Test!");
    // Save state.
    out.defaultWriteObject();
    // Save sum.
    out.writeObject(num);
  }

  /**
   * Read object (Deserialization).
   */
  private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    System.out.println("Read Test!");
    // Restore state.
    in.defaultReadObject();
    // Restore num.
    num = (int) in.readObject();
  }

}

现在的问题是,当我想将一个Test对象序列化为JSON文件时,例如使用Gson这样:

String json = new Gson().toJson(new Test());

...根本没有调用writeObject()和readObject(),我得到一个带有空对象的JSON文件。我使用的是Java 8。

可能是什么问题?

1 个答案:

答案 0 :(得分:2)

将在Java Serialization上调用

readObjectwriteObject方法,Java Serialization将当前对象的数据转换为字节并将这些字节写入流中,或者从流中读取字节并创建从那里的对象。您在那里做的是JSON序列化,不是 Java序列化,因此根本不会使用readObjectTest方法(除非JSON编码器/解码器确定它将使用它们)。如果你需要使用Gson自定义JSON的序列化/反序列化,你可以检查一下:http://www.studytrails.com/java/json/java-google-json-custom-serializer-deserializer.jsp(不是Gson用户,所以如果有其他人知道如何实现这一点,请随意编辑这篇文章以改进它)

此外,由于您的num课程中没有要序列化的字段,因此您获得的结果为空。请注意,Gson无法序列化transient,因为它标记为library(IRanges) #build an appropriate object dat = RangedData(space = dfin$chr, IRanges(dfin$start, dfin$end), sample = dfin$sample, type = dfin$type) dat #concatenate overlaps with an extra step of saving the concatenation mappings ans = RangedData(reduce(ranges(dat), with.revmap = TRUE)) ans