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(…)
将覆盖默认的序列化行为,从而中断使用。这与删除接口相同。