Mad*_*hik 32 java serialization static-members
当我们序列化对象时,静态成员不是序列化的,但是如果我们需要这样做,有什么办法吗?
Kat*_*one 18
第一个问题是为什么需要序列化静态成员?
静态成员与类关联,而不是与实例关联,因此在序列化实例时包含它们没有意义.
第一个解决方案是使这些成员不是静态的.或者,如果这些成员在原始类和目标类(相同的类,但可能是不同的运行时环境)中相同,则根本不要对它们进行序列化.
我对如何发送静态成员有一些想法,但我首先需要查看用例,因为在所有情况下都意味着更新目标类,我没有找到一个很好的理由这样做.
Vla*_*hev 16
人们,静态并不意味着IMMUTABLE.例如,我可能想要在JVM和/或主机重新启动之后序列化计算的整个状态(是的,包括静态字段 - 计数器等)以便稍后恢复.
正如已经说过的那样,正确的答案是使用Externalizable,而不是Serializable接口.然后,您可以完全控制外部化的内容和方式.
您可以通过实现以下内容来控制序列
private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
Run Code Online (Sandbox Code Playgroud)
有序列化的完整描述http://java.sun.com/developer/technicalArticles/Programming/serialization/.
正如其他答案所说,序列化静态并不是真的有意义,因为它不是你要序列化的对象,而是需要这样做,闻起来像你的代码还有其他问题给我.
小智 5
这是静态字段的序列化:newBookingNumber.
class Booking implements Serializable
{
/**
* Generated serial version ID.
*/
private static final long serialVersionUID = 5316748056989930874L;
// To hold new booking number.
private static int newBookingNumber = 0;
// The booking number.
private int bookingNumber;
/*
* Default serializable fields of a class are defined to be
* the non-transient and non-static fields. So, we have to
* write and read the static field separately.
*/
private void writeObject(ObjectOutputStream oos)
throws IOException
{
oos.defaultWriteObject();
oos.writeObject(new Integer(newBookingNumber));
}
private void readObject(ObjectInputStream ois)
throws ClassNotFoundException, IOException
{
ois.defaultReadObject();
newBookingNumber = (Integer)ois.readObject();
}
}
Run Code Online (Sandbox Code Playgroud)