【问题标题】:writeObject() and readObject() are not called during serialization序列化期间不调用 writeObject() 和 readObject()
【发布时间】:2015-11-17 20:15:01
【问题描述】:

我有一个测试类,如下所示:

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 json serialization gson


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!是的,我知道瞬态“修饰符”,这只是为示例代码提供一些逻辑的示例。
    猜你喜欢
    • 2015-08-18
    • 2011-08-20
    • 2019-01-29
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多