当前位置:   article > 正文

java将byte[]反序列化/转化为对象或者String,智能判断_java 反序列化判断字节是字符串还是对象

java 反序列化判断字节是字符串还是对象

理论依据基于此文章,主要通过byte数组的前几位判断是否是jdk序列化后的byte数组。

  1. /**
  2. * * 反序列化byte[]为object或者String。</br>
  3. * * 注意:如果是Object序列化后的byte[],仅适用jdk自带的序列化</br>
  4. * * 使用本方法能避免直接反序列化,通过异常判断是String还是Object(只有巧合的走异常流程)。
  5. */
  6. private Object unSerializeObjOrString(byte[] bytes)
  7. {
  8. // 不足6位,直接认为是字符串,,经测试单个字符序列化后的byte[]也有8位
  9. if (bytes.length < 6)
  10. {
  11. return SerializeUtil.Byte2String(bytes);
  12. }
  13. String protocol = Integer.toHexString(bytes[0] & 0x000000ff) + Integer.toHexString(bytes[1] & 0x000000ff);
  14. // 如果是jdk序列化后的
  15. if ("ACED".equals(protocol.toUpperCase()))
  16. {
  17. Object obj = SerializeUtil.unserializeObj(bytes);
  18. if (obj != null)
  19. {
  20. return obj;
  21. }
  22. // 如果是巧合,则返回的是null
  23. else
  24. {
  25. return SerializeUtil.Byte2String(bytes);
  26. }
  27. }
  28. // 如果是字符串的byte[]字节形式
  29. return SerializeUtil.Byte2String(bytes);
  30. }

serializeUtil工具类代码:

  1. /**
  2. * 序列化和反序列化工具类
  3. */
  4. public class SerializeUtil
  5. {
  6. /**
  7. * 统一编码,字符串获取byte数组</br>
  8. * 编码格式:UTF-8
  9. */
  10. public static byte[] String2Byte(String s)
  11. {
  12. if (s == null)
  13. {
  14. return null;
  15. }
  16. try
  17. {
  18. return s.getBytes("UTF-8");
  19. }
  20. catch (UnsupportedEncodingException e)
  21. {
  22. e.printStackTrace();
  23. return null;
  24. }
  25. }
  26. /**
  27. * 统一编码,byte数组转字符串</br>
  28. * 编码格式:UTF-8
  29. */
  30. public static String Byte2String(byte[] bytes)
  31. {
  32. if (bytes == null)
  33. {
  34. return null;
  35. }
  36. try
  37. {
  38. return new String(bytes, "UTF-8");
  39. }
  40. catch (UnsupportedEncodingException e)
  41. {
  42. e.printStackTrace();
  43. return null;
  44. }
  45. }
  46. /**
  47. * 序列化
  48. *
  49. * @param object
  50. * @return
  51. * @see [类、类#方法、类#成员]
  52. */
  53. public static byte[] serializeObj(Object object)
  54. {
  55. if (object == null)
  56. {
  57. return null;
  58. }
  59. ByteArrayOutputStream byteOutStream = null;
  60. ObjectOutputStream outputStream = null;
  61. try
  62. {
  63. byteOutStream = new ByteArrayOutputStream();
  64. outputStream = new ObjectOutputStream(byteOutStream);
  65. outputStream.writeObject(object);
  66. byte[] bytes = byteOutStream.toByteArray();
  67. return bytes;
  68. }
  69. catch (IOException e)
  70. {
  71. e.printStackTrace();
  72. return null;
  73. }
  74. finally
  75. {
  76. if (null != outputStream)
  77. {
  78. try
  79. {
  80. outputStream.close();
  81. }
  82. catch (IOException e)
  83. {
  84. e.printStackTrace();
  85. return null;
  86. }
  87. }
  88. if (null != byteOutStream)
  89. {
  90. try
  91. {
  92. byteOutStream.close();
  93. }
  94. catch (IOException e)
  95. {
  96. e.printStackTrace();
  97. return null;
  98. }
  99. }
  100. }
  101. }
  102. /**
  103. * 反序列化
  104. *
  105. * @param bytes
  106. * @return
  107. * @see [类、类#方法、类#成员]
  108. */
  109. public static Object unserializeObj(byte[] bytes)
  110. {
  111. ByteArrayInputStream byteInputStream = null;
  112. ObjectInputStream inputStream = null;
  113. try
  114. {
  115. byteInputStream = new ByteArrayInputStream(bytes);
  116. inputStream = new ObjectInputStream(byteInputStream);
  117. return inputStream.readObject();
  118. }
  119. catch (Exception e)
  120. {
  121. e.printStackTrace();
  122. return null;
  123. }
  124. finally
  125. {
  126. if (null != byteInputStream)
  127. {
  128. try
  129. {
  130. byteInputStream.close();
  131. }
  132. catch (IOException e)
  133. {
  134. e.printStackTrace();
  135. return null;
  136. }
  137. }
  138. if (null != inputStream)
  139. {
  140. try
  141. {
  142. inputStream.close();
  143. }
  144. catch (IOException e)
  145. {
  146. e.printStackTrace();
  147. return null;
  148. }
  149. }
  150. }
  151. }
  152. /**
  153. * key链表转byte二维数组
  154. */
  155. public static byte[][] serializeListString(List<String> list)
  156. {
  157. if (list == null)
  158. {
  159. return null;
  160. }
  161. byte[][] byteArray = new byte[list.size()][];
  162. for (int i = 0; i < list.size(); i++)
  163. {
  164. byte[] bytefield = SerializeUtil.String2Byte(list.get(i));
  165. byteArray[i] = bytefield;
  166. }
  167. return byteArray;
  168. }
  169. /**
  170. * key链表转byte二维数组
  171. */
  172. public static byte[][] serializeList(List<?> list)
  173. {
  174. if (list == null)
  175. {
  176. return null;
  177. }
  178. byte[][] byteArray = new byte[list.size()][];
  179. for (int i = 0; i < list.size(); i++)
  180. {
  181. byte[] bytefield = SerializeUtil.serializeObj(list.get(i));
  182. byteArray[i] = bytefield;
  183. }
  184. return byteArray;
  185. }
  186. /**
  187. * 将List<byte[]>反序列化为list<T> 集合
  188. */
  189. @SuppressWarnings("unchecked")
  190. public static <T> List<T> unserializeList(List<byte[]> bytes)
  191. {
  192. if (bytes == null)
  193. {
  194. return null;
  195. }
  196. List<T> list = new ArrayList<T>();
  197. for (byte[] ele : bytes)
  198. {
  199. T t = (T)SerializeUtil.unserializeObj(ele);
  200. list.add(t);
  201. }
  202. return list;
  203. }
  204. /**
  205. * Map<String,T>转 Map<byte[], byte[]> </br>
  206. * 其中第一个byte[]为String的字节码,第二个byte[]为T的序列化字节码
  207. */
  208. public static <T> Map<byte[], byte[]> serializeMap(Map<String, T> map)
  209. {
  210. if (map == null)
  211. {
  212. return null;
  213. }
  214. Map<byte[], byte[]> jedisMap = new HashMap<byte[], byte[]>();
  215. for (Map.Entry<String, T> entry : map.entrySet())
  216. {
  217. jedisMap.put(SerializeUtil.String2Byte(entry.getKey()), SerializeUtil.serializeObj(entry.getValue()));
  218. }
  219. return jedisMap;
  220. }
  221. /**
  222. * Map<String,T>转 Map<byte[], byte[]> </br>
  223. * 其中第一个byte[]为String的字节码,第二个byte[]为T的序列化字节码
  224. */
  225. public static Map<byte[], Double> serializeDoubleMap(Map<?, Double> map)
  226. {
  227. if (map == null)
  228. {
  229. return null;
  230. }
  231. Map<byte[], Double> jedisMap = new HashMap<byte[], Double>();
  232. for (Map.Entry<?, Double> entry : map.entrySet())
  233. {
  234. jedisMap.put(SerializeUtil.serializeObj(entry.getKey()), entry.getValue());
  235. }
  236. return jedisMap;
  237. }
  238. /**
  239. * 将字节map反序列化为Map
  240. *
  241. * @return
  242. */
  243. @SuppressWarnings("unchecked")
  244. public static <T> Map<String, T> unserializeMap(Map<byte[], byte[]> map)
  245. {
  246. if (map == null)
  247. {
  248. return null;
  249. }
  250. Map<String, T> result = new HashMap<String, T>();
  251. for (Map.Entry<byte[], byte[]> entry : map.entrySet())
  252. {
  253. result.put(SerializeUtil.Byte2String(entry.getKey()), (T)SerializeUtil.unserializeObj(entry.getValue()));
  254. }
  255. return result;
  256. }
  257. /**
  258. * 将List<byte[]>反序列化为Set<T> 集合
  259. */
  260. public static Set<String> byteSet2String(Set<byte[]> bytes)
  261. {
  262. if (bytes == null)
  263. {
  264. return null;
  265. }
  266. Set<String> set = new HashSet<String>();
  267. for (byte[] ele : bytes)
  268. {
  269. String t = SerializeUtil.Byte2String(ele);
  270. set.add(t);
  271. }
  272. return set;
  273. }
  274. /**
  275. * 将List<byte[]>反序列化为Set<T> 集合
  276. */
  277. @SuppressWarnings("unchecked")
  278. public static <T> Set<T> unserializeSet(Set<byte[]> bytes)
  279. {
  280. if (bytes == null)
  281. {
  282. return null;
  283. }
  284. Set<T> set = new HashSet<T>();
  285. for (byte[] ele : bytes)
  286. {
  287. T t = (T)SerializeUtil.unserializeObj(ele);
  288. set.add(t);
  289. }
  290. return set;
  291. }
  292. /**
  293. * 将List<byte[]>反序列化为Set<T> 集合
  294. */
  295. @SuppressWarnings("unchecked")
  296. public static <T> LinkedHashSet<T> unserializeSet2LinkedHashSet(Set<byte[]> bytes)
  297. {
  298. if (bytes == null)
  299. {
  300. return null;
  301. }
  302. LinkedHashSet<T> set = new LinkedHashSet<T>();
  303. for (byte[] ele : bytes)
  304. {
  305. T t = (T)SerializeUtil.unserializeObj(ele);
  306. set.add(t);
  307. }
  308. return set;
  309. }
  310. /**
  311. * 关闭io流对象
  312. *
  313. * @param closeable
  314. */
  315. public static void close(Closeable closeable)
  316. {
  317. if (closeable != null)
  318. {
  319. try
  320. {
  321. closeable.close();
  322. }
  323. catch (Exception e)
  324. {
  325. e.printStackTrace();
  326. }
  327. }
  328. }
  329. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/294508
推荐阅读
相关标签
  

闽ICP备14008679号