Java序列化和反序列化是一種將對(duì)象轉(zhuǎn)換成二進(jìn)制流,或?qū)⒍M(jìn)制流轉(zhuǎn)換成對(duì)象的過(guò)程。Java序列化和反序列化常用于網(wǎng)絡(luò)傳輸和數(shù)據(jù)存儲(chǔ)中。然而,在使用Java序列化和反序列化時(shí),有時(shí)會(huì)出現(xiàn)亂碼問(wèn)題。
Java序列化和反序列化過(guò)程中,使用的編碼通常是UTF-8。如果程序中使用的編碼類(lèi)型與UTF-8不同,就會(huì)出現(xiàn)亂碼。
// 示例代碼: public class SerializationDemo { public static void main(String[] args) throws Exception { String str = "這是一段中文"; ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt")); oos.writeObject(str); oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt")); String s = (String) ois.readObject(); System.out.println(s); ois.close(); } }
在上面的示例代碼中,如果系統(tǒng)默認(rèn)編碼不是UTF-8,那么輸出的字符串就會(huì)出現(xiàn)亂碼。解決這個(gè)問(wèn)題有多種方法:
- 指定編碼類(lèi)型。
- 在序列化和反序列化時(shí),添加自定義的轉(zhuǎn)換器。
// 修改示例代碼: public class SerializationDemo { public static void main(String[] args) throws Exception { String str = "這是一段中文"; ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt")); oos.writeObject(str); oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt")); String s = new String((byte[]) ois.readObject(), "UTF-8"); System.out.println(s); ois.close(); } }
在讀取對(duì)象時(shí),將字節(jié)數(shù)組轉(zhuǎn)換成String時(shí)指定編碼為UTF-8。
// 自定義轉(zhuǎn)換器 public class UTF8Serialization { public static byte[] serialize(Object obj) throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(out); oos.writeObject(obj); byte[] bytes = out.toByteArray(); oos.close(); out.close(); return bytes; } public static Object deserialize(byte[] bytes) throws Exception { ByteArrayInputStream in = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(in); Object obj = ois.readObject(); ois.close(); in.close(); return obj; } } // 修改示例代碼 public class SerializationDemo { public static void main(String[] args) throws Exception { String str = "這是一段中文"; byte[] bytes = UTF8Serialization.serialize(str); String s = (String) UTF8Serialization.deserialize(bytes); System.out.println(s); } }
通過(guò)自定義轉(zhuǎn)換器,可以在序列化和反序列化時(shí)使用自定義的編碼。
上一篇php - = .