最近需要用到jedis将对象保存到redis缓存中,查了下api,发现只接收String类型的参数,这样就需要将对象进行序列化了。
那么到底该如何序列化呢?由于好久没有做过这种事儿,一时间没什么思路,想到了toString可以把对象变成String,但是转不回来(除非自己手动解析字符串)。
后来又想到了用ObjectStream,但是直接用这个的时候,反序列时候会报“invalid stream header: EFBFBDEF”的异常。
网上搜了下,大概是由于写入和读出的逻辑不太一致,导致数据反序列化失败(这个应该是jedis或redis自己的问题,不是Java的,后面有时间再细看下,如果有朋友知道细节,欢迎留言)。
目前暂时有以下几种序列化的方法(当然肯定不止这些,暂时写这点,随时补充):
1. ObjectInputStream、ObjectOutputStream
Java自带的工具,在对象与byte数组之间转换,网上资料一大堆,不详细说了。
2. Base64
Java自带的编解码工具,详细路径是java.util.Base64,它主要是将byte数组进行编码和解码。
具体使用方式是:
Base64.getEncoder().endoce(byte);
Base64.getDecoder().decode(byte);
搭配ObjectInputStream和ObjectOutputStream使用:转byte后编码转String保存,读取转byte解密后再反序列化。
这个好处是存储的信息不是明文的,直接看不出来,对于一些略敏感的数据可以使用(当然并没有加密,防君子不防小人)。
3. Json
做web多年竟然忘了这个,真是失败(掩面)
可以将对象进行Json化,常用的有阿里的fastjson和著名的jackson。其中fastjson对一些特殊字符不支持,且存在一些隐藏bug,有些公司不太推荐(使用上倒是方便)。
这个的特点在于存储的信息是明文的,什么都能看到,方便调试和查问题。