【问题标题】:How Is Serializable ThreadLocal?Serializable ThreadLocal 是如何实现的?
【发布时间】:2020-06-25 12:40:29
【问题描述】:

我正在尝试序列化一个神经网络,但我面临的事实是我不知道该怎么做。我的代码。

public class Layer implements Serializable {
private final int size;
private ThreadLocal<Vec> out = new ThreadLocal<>();
private Activation activation;
private Optimizer optimizer;
private Matrix weights;
private Vec bias;
private double l2 = 0;

private Layer precedingLayer;

但是在序列化时,我得到以下异常 - 线程“主”java.io.NotSerializableException 中的异常:java.lang.ThreadLocal 如何序列化我的课程?

【问题讨论】:

  • 不应该outstatic 字段吗? Per the documentation: ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).
  • 如果我把这个字段设为静态,肯定不会被序列化。

标签: java serialization thread-local


【解决方案1】:

因为你的Layer类中的一个字段没有实现Serializable,java不知道如何序列化一个Layer的实例。

具体来说,如异常消息所示,ThreadLocal&lt;Vec&gt; out 就是这样一个无法序列化的字段,如果查看该类,您会发现它没有实现 Serializable 接口。

线程本地:https://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html

可序列化:https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

你可能会创建一个这样的类来编译:

import java.io.Serializable;

public class SerializableThreadLocal<T> extends ThreadLocal<T> implements Serializable {

}

然后在你开始的时候实例化一个SerializableThreadLocal的实例,像这样:

private ThreadLocal<Vec> out = new SerializableThreadLocal<Vec>();

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2018-04-29
    • 2012-08-03
    • 1970-01-01
    相关资源
    最近更新 更多