2012-03-08 3 views
0

Мне нужно сериализовать данные из статического HashMap. Мне нужны эти статические данные, потому что у меня нет экземпляра класса, в котором эта карта существует. я реализовать интерфейс сериализации и построить эти два метода:Методы сериализации никогда не называются

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

+1

Почему бы просто не сериализовать HashMap? –

+0

Класс имеет только статические методы и кэширует некоторый user_id в статической переменной. – Happo

ответ

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

+0

Добро пожаловать. Но я думаю, что он будет работать (синхронизированное ключевое слово было сброшено :)). Я удаляю как –

1

Оставьте заявку synchronized; эти методы должны быть потокобезопасными без этого. Если вам нужна синхронизация, вы должны реализовать ее по-разному (например, с помощью блокировок), чтобы избежать взаимоблокировок.

[EDIT] Там могут быть две причины, почему эти методы не называют:

  1. подпись не 100% правильно

  2. Эти экземпляры всегда помечается как transient

+0

. Это также не влияет. Я нахожу оба варианта в Интернете. Но спасибо за подсказку. – Happo

0

Мне нужны эти статические данные, потому что у меня есть нет экземпляра класса в , который существует в этой карте.

Это не имеет никакого смысла. Если у вас нет экземпляра, вы не можете получить карту, чтобы не сериализовать ее, и если экземпляр не существует, то и карта не будет.

Howver, если у вас есть магическая привязка к карте, так что просто сериализуйте ее, вам не нужно писать какие-либо методы readObject/writeObject. Просто позвоните ObjectOutputStream.writeObject() с картой в качестве аргумента и т. Д.

Смежные вопросы