从未调用过序列化的方法

时间:2012-03-08 14:39:59

标签: java serialization

我需要从静态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() );
    }   
}

但这种方法从未被调用过。 对于这个人有任何相同的问题或解决方案吗?

3 个答案:

答案 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;没有这个,方法必须是线程安全的。如果需要同步,则必须以不同方式实现(例如使用锁)以避免死锁。

[编辑] 为什么不调用这些方法可能有两个原因:

  1. 签名不是100%正确

  2. 这些实例始终标记为transient

答案 2 :(得分:0)

  

我需要这个静态数据,因为我没有该类的实例   这张地图存在。

这没有任何意义。如果您没有实例,则无法获取地图,因此您无法对其进行序列化,如果实例不存在,则地图也不会。

如果你以某种方式神奇地引用了地图,只需序列化它,你就不需要编写任何readObject / writeObject方法来执行此操作。只需使用地图作为参数调用ObjectOutputStream.writeObject()等等。