2012-03-08 46 views
0

我需要序列化来自静态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

您是如何使用该类的?只要看看序列化代码,就很难弄清楚为什么它没有被调用。 – twain249 2012-03-08 14:42:41

+1

为什么不只是序列化HashMap? – 2012-03-08 14:44:29

+0

该类只有静态方法,并将某个user_id缓存在静态变量中。 – Happo 2012-03-08 14:45:46

回答

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); 
     } 

    } 

同步关键字时并不需要,方法被称为在同步块中。

+0

这不是解决方案,但谢谢。 – Happo 2012-03-08 14:54:43

+0

欢迎你。但我认为它会工作(同步关键字被丢弃:))。我删除了两个 – 2012-03-08 15:08:53

1

删除​​;这些方法必须是线程安全的。如果你需要同步,你必须以不同的方式实现它(例如用锁)以避免死锁。

[编辑]可能有两个原因的方法是不叫:

  1. 的签名是不是100%正确

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

+0

这也没有效果。我在网上找到了两种变体。但是,谢谢你的提示。 – Happo 2012-03-08 14:49:42

0

我需要这个静态数据,因为我有没有这个地图存在的 中的班级实例。

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

不管怎样,如果你奇迹般地以某种方式参考了地图,只需要序列化它,就不需要编写任何readObject/writeObject方法。只需拨打ObjectOutputStream.writeObject()与地图作为参数等。

相关问题