我需要从静态HashMap序列化数据。我需要这个静态数据,因为我没有这个地图存在的类的实例。 我实现了serializable接口并构建了这两个方法:
private synchronized void writeObject( ObjectOutputStream out ) throws IOException
{
System.out.println("start serialization ...");
Collection<TaskUpdateListener> tasks = listeners.values();
out.writeInt( tasks.size() );
for(TaskUpdateListener task : tasks)
{
out.writeObject( task );
}
}
private synchronized void readObject( ObjectInputStream in ) throws IOException, ClassNotFoundException
{
System.out.println("start deserialization ...");
int size = in.readInt();
for( int index = 0; index < size; index++)
{
addTaskUpdateListener( (ComponentScheduleTable) in.readObject() );
}
}
但这种方法从未被调用过。 对于这个人有任何相同的问题或解决方案吗?
答案 0 :(得分:1)
尝试
private void writeObject( ObjectOutputStream out ) throws IOException
{
System.out.println("start serialization ...");
Collection<TaskUpdateListener> tasks = listeners.values();
out.writeInt( tasks.size() );
for(TaskUpdateListener task : tasks)
{
out.writeObject( task );
}
}
不需要同步关键字,在同步块中调用方法。
答案 1 :(得分:1)
放弃synchronized
;没有这个,方法必须是线程安全的。如果需要同步,则必须以不同方式实现(例如使用锁)以避免死锁。
[编辑] 为什么不调用这些方法可能有两个原因:
签名不是100%正确
这些实例始终标记为transient
答案 2 :(得分:0)
我需要这个静态数据,因为我没有该类的实例 这张地图存在。
这没有任何意义。如果您没有实例,则无法获取地图,因此您无法对其进行序列化,如果实例不存在,则地图也不会。
如果你以某种方式神奇地引用了地图,只需序列化它,你就不需要编写任何readObject
/ writeObject
方法来执行此操作。只需使用地图作为参数调用ObjectOutputStream.writeObject()
等等。