2016-09-28 52 views
-1

我使用這個靜態類作爲在以各種方式發送/使用它們之前將對象序列化爲字符串的一種方式。然而,序列化的對象似乎只能正確地序列化一次。一個從20開始並且每次更新增量的變量只能達到21,即使我在序列化之前打印它的值是正確的(大約在1500左右)。使用ObjectOutputStream對Java進行序列化的對象工作一次,雙方嘗試reset()兩次

在你回答之前,請注意,我用的復位(),並與writeUnshared()。我嘗試了幾乎所有我可以在網上找到的東西,似乎沒有任何工作。

public class InformationInterface { 

static ObjectInputStream ois; 
static ObjectOutputStream oos; 
static ByteArrayOutputStream baos; 

public static Object fromString(String s) throws IOException , 
     ClassNotFoundException { 
    byte [] data = Base64.getDecoder().decode(s); 
    ois = new ObjectInputStream(
      new ByteArrayInputStream( data)); 
    Object o = ois.readUnshared(); 
    ois.close(); 
    return o; 
} 

public static String toString(Serializable o) throws IOException { 
    if(baos!=null){ 
     baos.flush(); 
    } 
    baos = new ByteArrayOutputStream(); 
    baos.reset(); 
    oos = new ObjectOutputStream(baos); 
    oos.reset(); 
    oos.writeUnshared(o); 
    oos.flush(); 
    oos.close(); 
    return Base64.getEncoder().encodeToString(baos.toByteArray()); 
} 

} 

我已經看了很多帖子在這裏指出的ObjectInputStream保持發送對象的引用(即使IM創建一個新的每一次且只保留一個參考序列化之間)使用與writeUnshared()或復位()的工作原理在發送多個對象,但我似乎無法讓它在我的工作。

我不明白爲什麼這不工作。我甚至不會同時發送多個對象,只是想要在我的服務器的整個生命週期中序列化相同的對象。但是,接收到第一個更新後,收到的序列化的based64字符串根本不會改變。

注意,我試過多種其他的方法來做到這一點,包括堅持一個直接try/catch塊創建一個全新的ObjectOutputStream和調用reset身在何方我通常會調用這些靜態函數。我也嘗試使用ObjectOutput和ObjectInput並得到相同的結果。

每個人似乎都使用reset()解決了他們的問題,以及這不是我的情況。我可以在代碼中的其他地方做錯嗎?由於我在序列化之前讀取了數據,並且可以確認它應該是序列化之前的新對象,所以我懷疑這個問題非常遙遠。

編輯,就試圖用apacheutils不同的方式,我也得到同樣的結果。以下是帶有輸出的新代碼:

public static Object fromString(String s) throws IOException , 
     ClassNotFoundException { 
    return convertFromBytes(Base64.getDecoder().decode(s)); 
} 
private static byte[] convertToBytes(Serializable object) throws IOException { 
    ClientInformation client = (ClientInformation)object; 
    System.out.println(client.hp); 
    return SerializationUtils.serialize(object); 
} 
private static Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException { 
    return SerializationUtils.deserialize(bytes); 
} 
public static String toString(Serializable o) throws IOException { 
    String s = Base64.getEncoder().encodeToString(convertToBytes(o)); 
    System.out.println(s); 
    return s; 
} 


794 
rO0ABXNyACBjb20ucjMuZW5kZ2FtZS5DbGllbnRJbmZvcm1hdGlvbj8t7NEouSNIAgAISQACaHBTAAdzbmFrZWlkSQAIc3Bkc2NhbGVMAANhYmN0ABJMamF2YS9sYW5nL1N0cmluZztMAAJpcHEAfgABTAAEbmFtZXEAfgABTAAIcG9zaXRpb250AB9MY29tL2JhZGxvZ2ljL2dkeC9tYXRoL1ZlY3RvcjI7TAAFc3BlZWRxAH4AAnhwAAADGgGkAAAAAXB0ABAvMTI3LjAuMC4xOjQ1Mzk0dAAHYXMzMmRkZHNyAB1jb20uYmFkbG9naWMuZ2R4Lm1hdGguVmVjdG9yMgyu1b5sQZuzAgACRgABeEYAAXl4cAAAAAAAAAAAc3EAfgAGPczMzQAAAAA= 
795 
rO0ABXNyACBjb20ucjMuZW5kZ2FtZS5DbGllbnRJbmZvcm1hdGlvbj8t7NEouSNIAgAISQACaHBTAAdzbmFrZWlkSQAIc3Bkc2NhbGVMAANhYmN0ABJMamF2YS9sYW5nL1N0cmluZztMAAJpcHEAfgABTAAEbmFtZXEAfgABTAAIcG9zaXRpb250AB9MY29tL2JhZGxvZ2ljL2dkeC9tYXRoL1ZlY3RvcjI7TAAFc3BlZWRxAH4AAnhwAAADGwGkAAAAAXB0ABAvMTI3LjAuMC4xOjQ1Mzk0dAAHYXMzMmRkZHNyAB1jb20uYmFkbG9naWMuZ2R4Lm1hdGguVmVjdG9yMgyu1b5sQZuzAgACRgABeEYAAXl4cAAAAAAAAAAAc3EAfgAGPczMzQAAAAA= 
796 
rO0ABXNyACBjb20ucjMuZW5kZ2FtZS5DbGllbnRJbmZvcm1hdGlvbj8t7NEouSNIAgAISQACaHBTAAdzbmFrZWlkSQAIc3Bkc2NhbGVMAANhYmN0ABJMamF2YS9sYW5nL1N0cmluZztMAAJpcHEAfgABTAAEbmFtZXEAfgABTAAIcG9zaXRpb250AB9MY29tL2JhZGxvZ2ljL2dkeC9tYXRoL1ZlY3RvcjI7TAAFc3BlZWRxAH4AAnhwAAADHAGkAAAAAXB0ABAvMTI3LjAuMC4xOjQ1Mzk0dAAHYXMzMmRkZHNyAB1jb20uYmFkbG9naWMuZ2R4Lm1hdGguVmVjdG9yMgyu1b5sQZuzAgACRgABeEYAAXl4cAAAAAAAAAAAc3EAfgAGPczMzQAAAAA= 
797 
rO0ABXNyACBjb20ucjMuZW5kZ2FtZS5DbGllbnRJbmZvcm1hdGlvbj8t7NEouSNIAgAISQACaHBTAAdzbmFrZWlkSQAIc3Bkc2NhbGVMAANhYmN0ABJMamF2YS9sYW5nL1N0cmluZztMAAJpcHEAfgABTAAEbmFtZXEAfgABTAAIcG9zaXRpb250AB9MY29tL2JhZGxvZ2ljL2dkeC9tYXRoL1ZlY3RvcjI7TAAFc3BlZWRxAH4AAnhwAAADHQGkAAAAAXB0ABAvMTI3LjAuMC4xOjQ1Mzk0dAAHYXMzMmRkZHNyAB1jb20uYmFkbG9naWMuZ2R4Lm1hdGguVmVjdG9yMgyu1b5sQZuzAgACRgABeEYAAXl4cAAAAAAAAAAAc3EAfgAGPczMzQAAAAA= 

正如您所看到的,序列化的字符串是相同的。

+0

你真的必須自己實現對象到文本的序列化解決方案嗎?如果不是,請嘗試[xstream](http://x-stream.github.io/tutorial.html)。它非常易於使用,您可以選擇將XML轉換爲對象還是將對象轉換爲[JSON](https://en.wikipedia.org/wiki/JSON)。 – Dangermouse

+0

我真正想要的是將我的對象變成base64字符串。只要字符串可以包含我的對象,我就不需要花哨或功能完整的序列化。我不明白的是,爲什麼在第一個序列化之後的每個序列化嘗試都會返回同一個對象,即使序列化之前的數據明顯不同。 – r3eckon

+2

發佈您正在序列化的課程以及調用您發佈內容的代碼。 – EJP

回答

1

這是你不應該給我的FYI。

從代碼方面,我做的事:

public static void main(String[] args) throws IOException { 
    ClientInformation ci = new ClientInformation(); 
    //  System.out.println(toString(ci)); 
    toString(ci); 
    ci.hp = 3; 
    toString(ci); 
    //  System.out.println(toString(ci)); 
} 

@SuppressWarnings("serial") 
private static class ClientInformation implements Serializable { 
    public int hp = 2; 
} 

我用你的代碼運行它從IDE,這就是結果:

2 
rO0ABXNyADduZXRjcmF3bGVyLmZhY3Rvcmllcy5BcHBsaWNhbnRGYWN0b3J5JENsaWVudEluZm9ybWF0aW9uu7p3ca7TTqkCAAFJAAJocHhwAAAAAg== 
3 
rO0ABXNyADduZXRjcmF3bGVyLmZhY3Rvcmllcy5BcHBsaWNhbnRGYWN0b3J5JENsaWVudEluZm9ybWF0aW9uu7p3ca7TTqkCAAFJAAJocHhwAAAAAw== 

字符串不匹配。問題不在這裏。

相關問題