Java 查找序列化用法

Java 查找序列化用法,java,serialization,Java,Serialization,我正在编写一些应用程序,我有一个类标记为Serializable,但我怀疑它没有在任何地方被序列化,因此不需要Serializable标记 确保这一点的最佳方法是什么?可以静态地确定吗 谢谢,不是直接的。通常,序列化发生在将对象写入ObjectOutputStream时,但这通常发生在代码之外(例如在您正在使用的库中或在您的容器中)。所以你有两个选择: 动态-在类上定义此方法。因此,您最终将知道该类是否正在序列化,而不会破坏任何功能。但您需要系统运行: private void writeOb

我正在编写一些应用程序,我有一个类标记为
Serializable
,但我怀疑它没有在任何地方被序列化,因此不需要
Serializable
标记

确保这一点的最佳方法是什么?可以静态地确定吗


谢谢,不是直接的。通常,序列化发生在将对象写入
ObjectOutputStream
时,但这通常发生在代码之外(例如在您正在使用的库中或在您的容器中)。所以你有两个选择:

  • 动态-在类上定义此方法。因此,您最终将知道该类是否正在序列化,而不会破坏任何功能。但您需要系统运行:

    private void writeObject(java.io.ObjectOutputStream out) {
       out.defaultWriteObject();
       log.info("Object of type " + 
          getClass().getName() + " is being serialized");
       // optionally include a stacktrace here, or use a debugger, to see
       // when exactly it happened
    }
    
  • 试着理解你的目标要去哪里。如果它通过网络传输,或者存储在临时存储器(会话、缓存)中,那么它应该是可序列化的。否则,很可能不会


我认为静态确定是不可能的,至少非常困难-您的对象可以是非通用集合的一部分,它可以被反射等使用


您可以做的是将一些日志/调试代码放入对象的readResolve()和writeReplace()方法中,当对象被序列化/反序列化时,jvm会调用这些方法。

我很确定,它不能被静态检查,除非您根本不使用外部库(这不会导致严重的程序)

也许您正在使用某种ORM,如Hibernate,在某些情况下需要具有可序列化对象,或者您的对象必须通过Web服务或其他中间件堆栈(如Corba)发送,其中序列化是隐式完成的(当对象被标记为可序列化对象时)


您的类的用途是什么?

您能否删除
实现可序列化的
并查看它是否编译和运行?我相信如果您需要它,它将不会编译。@Marco,这不是真的,您可以编译一段代码,然后仍然会出现无法序列化的运行时错误。使用
writeReplace(…)
将覆盖默认的序列化行为,从而中断使用。这与删除接口相同。