是否应该将Log4J记录器声明为瞬态?

2022-09-01 10:37:42

我正在使用Java 1.4和Log4J。

我的一些代码涉及序列化和反序列化值对象 (POJO)。

我的每个POJO都声明一个记录器

private final Logger log = Logger.getLogger(getClass());

序列化程序抱怨 org.apache.log4j.Logger 不可序列化。

我应该使用

private final transient Logger log = Logger.getLogger(getClass());

相反?


答案 1

使用静态记录器怎么样?或者,您是否需要为类的每个实例提供不同的记录器引用?默认情况下不序列化静态字段;您可以显式声明要使用命名 的私有、静态、最终数组进行序列化的字段。请参阅 Oracle 文档ObjectStreamFieldserialPersistentFields

新增内容:当您使用getLogger(getClass())时,您将在每个实例中使用相同的记录器。如果要为每个实例使用单独的记录器,则必须在 getLogger() -方法中区分记录器的名称。例如 getLogger(getClass().getName() + hashCode())。然后,应使用 transient 属性来确保记录器未序列化。


答案 2

记录器必须是静态的;这将使它不可序列化。

没有理由让记录器成为非静态的,除非你有充分的理由这样做。