繁体   English   中英

序列化过程中未调用writeObject()和readObject()

[英]writeObject() and readObject() are not called during serialization

我有一个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。

可能是什么问题呢?

将在Java序列化上调用writeObjectreadObject方法,该方法是将当前对象的数据转换为字节,然后将这些字节写入流中,或者从流中读取字节并从中创建对象。 您正在执行的操作是JSON序列化,而不是 Java序列化,因此根本不会使用writeObjectreadObject方法(除非JSON编码器/解码器确定它将使用它们)。 如果您需要使用Gson自定义JSON的序列化/反序列化,则可以检查以下内容: http : //www.studytrails.com/java/json/java-google-json-custom-serializer-deserializer.jsp (不是Gson用户,因此,如果还有其他人知道如何实现此目标,请随时编辑此帖子以进行改进)

另外,您得到的结果是空的,因为Test类中没有要序列化的字段。 请注意, num不能被Gson序列化,因为它被标记为transient

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM