2016-10-17 82 views
2

在我的项目中我有许多多线程进程通过套接字进行通信。当我发送hashmap,更新它,然后再发送它时,我遇到了一个问题。 第二次发送后我得到的地图值没有更新。 我转载了这个示例类问题:序列化哈希表未更新

package test; 

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.HashMap; 

public class Test { 
    //TEST 

     static class MyKey implements Serializable{ 
      String nome; 
      String nomeM; 
      int altro; 
      public MyKey(String nome, String nomeM, int altro) { 
       super(); 
       this.nome = nome; 
       this.nomeM = nomeM; 
       this.altro = altro; 
      } 
      @Override 
      public int hashCode() { 
       final int prime = 31; 
       int result = 1; 
       result = prime * result + ((nome == null) ? 0 : nome.hashCode()); 
       result = prime * result + ((nomeM == null) ? 0 : nomeM.hashCode()); 
       return result; 
      } 
      @Override 
      public boolean equals(Object obj) { 
       if (this == obj) 
        return true; 
       if (obj == null) 
        return false; 
       if (getClass() != obj.getClass()) 
        return false; 
       MyKey other = (MyKey) obj; 
       if (nome == null) { 
        if (other.nome != null) 
         return false; 
       } else if (!nome.equals(other.nome)) 
        return false; 
       if (nomeM == null) { 
        if (other.nomeM != null) 
         return false; 
       } else if (!nomeM.equals(other.nomeM)) 
        return false; 
       return true; 
      } 

     } 
     static class MyValue implements Serializable{ 
      int num; 
      boolean bool; 
      public MyValue(int num, boolean bool) { 
       super(); 
       this.num = num; 
       this.bool = bool; 
      } 
      public String toString() { 
       return num + " " + bool; 
      } 
     } 

     public static void main(String [] args) { 
      final int port = 9876; 
      final MyKey myKey = new MyKey("foo","bar",42); 
      Thread writer = new Thread(new Runnable() { 
       public void run() { 
        ServerSocket ss = null; 
        try { 
         ss = new ServerSocket(port); 

         ObjectOutputStream oos = new ObjectOutputStream(ss.accept().getOutputStream()); 

         HashMap<MyKey,MyValue> map = new HashMap<>(); 

         map.put(myKey, new MyValue(1,false)); 

         System.out.println("writer step 1: "+map.get(myKey).toString()); 

         oos.writeObject(map); 
         oos.flush(); 

         map.put(myKey, new MyValue(0,true)); 


         System.out.println("writer step 2: "+map.get(myKey).toString()); 


         oos.writeObject(map); 
         oos.flush(); 

         oos.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
      Thread reader = new Thread(new Runnable() { 
       public void run() { 
        try { 
         Socket s = new Socket("localhost",port); 
         ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); 

         HashMap<MyKey,MyValue> map = (HashMap<MyKey,MyValue>) ois.readObject(); 

         System.out.println("reader step 1: "+map.get(myKey).toString()); 

         map = (HashMap<MyKey,MyValue>) ois.readObject(); 

         System.out.println("reader step 2: "+map.get(myKey).toString()); 

         ois.close(); 
         s.close(); 
        } catch (UnknownHostException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } catch (ClassNotFoundException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 

      writer.start(); 
      reader.start(); 
     } 
     //FINE TEST 
} 

这就是我得到:

writer step 1: 1 false 
writer step 2: 0 true 
reader step 1: 1 false 
reader step 2: 1 false 

我也试过换地图的另一个类,但我没有成功。

我在想什么?

+0

您有什么问题在这? – Prasath

回答

0

这是因为你没有在你的ObjectOutputStream所以默认它认为它已经被这就是流写入流中的同一对象(这里是地图)之前,为什么你继续看到以前叫reset()州。

重置将忽略已写入 流的任何对象的状态。状态重置为与新的ObjectOutputStream相同。 流中的当前点被标记为重置,因此 对应的ObjectInputStream将在同一点重置。 以前写入流的对象将不会被称为 已在流中。他们会再次被写入流中。

试试这个:

// Call reset before writing your map for the second time 
oos.reset(); 
// Write the map 
oos.writeObject(map); 

输出:

writer step 1: 1 false 
writer step 2: 0 true 
reader step 1: 1 false 
reader step 2: 0 true 
+0

非常感谢!所以问题是,如果没有调用reset,任何时候我发送一个对象到前一个为'==',我会得到对象的第一个状态。是对的吗? – Svech87

+0

@ Svech87是的,这是主意 –