为什么我们序列化java类并声明一个变量static会不会序列化它?

时间:2017-02-06 10:13:20

标签: java serialization static

像Logger这样的静态类没有被序列化。为什么?

1 个答案:

答案 0 :(得分:0)

将类标记为"RMI TCP Connection(733561)-10.219.11.2" #130543 daemon prio=5 os_prio=0 tid=0x00007f513007a800 nid=0x64d0 waiting on condition [0x00007f4f7e8e5000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000c050e3e0> (a java.util.concurrent.locks.ReentrantReadWriteLock$FairSync) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(AbstractQueuedSynchronizer.java:967) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1283) at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:727) at com.sun.jmx.mbeanserver.Repository.query(Repository.java:528) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.queryMBeansImpl(DefaultMBeanServerInterceptor.java:511) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.queryMBeans(DefaultMBeanServerInterceptor.java:503) at com.sun.jmx.mbeanserver.JmxMBeanServer.queryMBeans(JmxMBeanServer.java:592) at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1481) at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1307) at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1399) at javax.management.remote.rmi.RMIConnectionImpl.queryMBeans(RMIConnectionImpl.java:535) at sun.reflect.GeneratedMethodAccessor100.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323) at sun.rmi.transport.Transport$1.run(Transport.java:200) at sun.rmi.transport.Transport$1.run(Transport.java:197) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:196) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$241(TCPTransport.java:683) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$1/2095057400.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) 时,您要求Java运行时序列化类的对象实例。这有助于将对象中的数据转换为可存储的格式,以便存储或通过strean发送。

另一方面,Serializable成员不属于任何类,并且不属于序列化范围。因此,标记您的班级static不会影响任何班级的Serializable成员。

反序列化对象时,加载类时,其所有类的static成员都已在其他JVM中初始化。因此,将静态字段数据作为序列化对象的一部分发送是没有意义的。

有关详细信息,请参阅this article

希望这有帮助!