我使用這個靜態類作爲在以各種方式發送/使用它們之前將對象序列化爲字符串的一種方式。然而,序列化的對象似乎只能正確地序列化一次。一個從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=
正如您所看到的,序列化的字符串是相同的。
你真的必須自己實現對象到文本的序列化解決方案嗎?如果不是,請嘗試[xstream](http://x-stream.github.io/tutorial.html)。它非常易於使用,您可以選擇將XML轉換爲對象還是將對象轉換爲[JSON](https://en.wikipedia.org/wiki/JSON)。 – Dangermouse
我真正想要的是將我的對象變成base64字符串。只要字符串可以包含我的對象,我就不需要花哨或功能完整的序列化。我不明白的是,爲什麼在第一個序列化之後的每個序列化嘗試都會返回同一個對象,即使序列化之前的數據明顯不同。 – r3eckon
發佈您正在序列化的課程以及調用您發佈內容的代碼。 – EJP